九、Python 面向對象

1、Python3 面向對象

     1)類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
     2)方法:類中定義的函數。
     3)類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作爲實例變量使用。
    4)數據成員:類變量或者實例變量用於處理類及其實例對象的相關的數據。
    5)方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱爲方法的重寫。
    6)局部變量:定義在方法中的變量,只作用於當前實例的類。
    7)實例變量:在類的聲明中,屬性是用變量來表示的,這種變量就稱爲實例變量,實例變量就是一個用 self 修飾的變量。
    8)繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作爲一個基類對象對待。
      例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。
    9)實例化:創建一個類的實例,類的具體對象。
   10)對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。

2、類定義 

語法格式如下:
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>
 

3、類對象

類對象支持兩種操作:屬性引用和實例化
屬性引用使用和 Python 中所有的屬性引用一樣的標準語法:obj.name。
類對象創建後,類命名空間中所有的命名都是有效屬性名

class Dog:
    #定義基本屬性
    name = ''      # 狗的名稱
    color = ''     # 狗的顏色
    #兩個下劃線開頭  定義私有屬性,私有屬性在類外部無法直接進行訪問
    __kind = ''      # 狗的品種

    #構造方法
    def __init__(self,name,color,kind):
       self.name = name
       self.color = color
       self.kind = kind

    #打印信息
    def printInfo(self):
        print('狗的品種是:',self.kind)

4、繼承

語法格式:
class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>
    
    1)需要注意圓括號中基類的順序,若是基類中有相同的方法名,而在子類使用時未指定,python從左至右搜索 
即方法在子類中未找到時,從左到右查找基類中是否包含方法。

     2)BaseClassName(示例中的基類名)必須與派生類定義在一個作用域內。除了類,還可以用表達式,
基類定義在另一個模塊中時這一點非常有用

class SubDog(Dog):
    price = .0   #狗的價格

    #初始化
    def __init__(self,name,color,kind,price):
        Dog.__init__(self,name,color,kind)
        self.price = price

    #覆寫父類方法(重寫)
    def printInfo(self):
        print('狗的品種是:',self.kind,',價格爲',self.price)

 5、多繼承

 語法格式:
    class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
    
    注意:
        儘量避免使用多繼承,因爲父類有相同的變量和方法,則會按照繼承的順序,
    從左到右依次匹配相應的變量和方法,導致獲取的不是自己想要的

 

#參加跳舞比賽
class Dance():
    danceName = ''   #舞蹈名稱
    sort = 0    #舞蹈獲取的名次
    #初始化
    def __init__(self,name,sort):
        self.danceName = name
        self.sort = sort

    #比賽結果
    def result(self):
        print('我參加比賽的舞蹈名爲: %s,獲得第%s名'%(self.danceName,1))

#多繼承
class SpeakDog(SubDog,Dance):
    isSpeak = False
    def __init__(self,name,color,kind,price,danceName,sort,isSpeak):
        SubDog.__init__(self,name,color,kind,price)
        Dance.__init__(self,danceName,sort)
        self.isSpeak = isSpeak

    def printInfo(self):
        if self.isSpeak:
            print('%s是一隻會叫的狗' % self.name)
        else:
            print('%s是一隻不會叫的狗' % self.name)

6、類屬性與方法

1)類的私有屬性
    __private_attrs:兩個下劃線開頭,聲明該屬性爲私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs。

2)類的方法
    在類的內部,使用 def 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數 self,
且爲第一個參數,self 代表的是類的實例。
self 的名字並不是規定死的,也可以使用 this,但是最好還是按照約定是用 self。

3)類的私有方法
    __private_method:兩個下劃線開頭,聲明該方法爲私有方法,只能在類的內部調用 ,不能在類的外部調用。self.__private_methods

#類的私有屬性實例
class CounterTest:
    __secretCount = 0  # 私有變量
    publicCount = 0    # 公開變量

    def count(self):            # 公共方法
        self.__secretCount += 1
        self.publicCount += 1
        print('這是公共方法,私有變量__secretCount的值爲:',self.__secretCount)

    def __addNum(self,a,b):    # 私有方法
        return a+b

counter = CounterTest()
counter.count()
print('公有變量publicCount的值爲:',counter.publicCount)
# print(counter.__secretCount)  # 報錯,實例不能訪問私有變量


#程序入口
if __name__ == '__main__':
    # 實例化類
    dog = Dog('小黑','黑色','哈士奇')
    print(dog.name, dog.color, dog.kind)

    subDog = SubDog('小布丁','棕色','泰迪',1239.2)
    subDog.printInfo()  #子類調用重寫方法
    print("調用父類重寫的方法:",end='')
    super(SubDog,subDog).printInfo()  #用子類對象調用父類已被覆蓋的方法

    speakdog = SpeakDog('小布丁','棕色','泰迪',1239.2,'恭喜發財',1,True)
    speakdog.printInfo()
    speakdog.result()

7、給各位大佬奉茶

    測試筆記

#1、Python3 面向對象
print()
print('1、Python3 面向對象')
'''
1)類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
2)方法:類中定義的函數。
3)類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作爲實例變量使用。
4)數據成員:類變量或者實例變量用於處理類及其實例對象的相關的數據。
5)方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱爲方法的重寫。
6)局部變量:定義在方法中的變量,只作用於當前實例的類。
7)實例變量:在類的聲明中,屬性是用變量來表示的,這種變量就稱爲實例變量,實例變量就是一個用 self 修飾的變量。
8)繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作爲一個基類對象對待。
  例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。
9)實例化:創建一個類的實例,類的具體對象。
10)對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。

'''
# 2、類定義
print()
print('2、類定義')
'''
語法格式如下:
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>
'''
# 3、類對象
print()
print('3、類對象')
'''
    類對象支持兩種操作:屬性引用和實例化。
屬性引用使用和 Python 中所有的屬性引用一樣的標準語法:obj.name。
類對象創建後,類命名空間中所有的命名都是有效屬性名
'''
class Dog:
    #定義基本屬性
    name = ''      # 狗的名稱
    color = ''     # 狗的顏色
    #兩個下劃線開頭  定義私有屬性,私有屬性在類外部無法直接進行訪問
    __kind = ''      # 狗的品種

    #構造方法
    def __init__(self,name,color,kind):
       self.name = name
       self.color = color
       self.kind = kind

    #打印信息
    def printInfo(self):
        print('狗的品種是:',self.kind)


# 4、繼承
'''
語法格式:
class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>
    
    1)需要注意圓括號中基類的順序,若是基類中有相同的方法名,而在子類使用時未指定,python從左至右搜索 
即方法在子類中未找到時,從左到右查找基類中是否包含方法。

     2)BaseClassName(示例中的基類名)必須與派生類定義在一個作用域內。除了類,還可以用表達式,
基類定義在另一個模塊中時這一點非常有用
'''
class SubDog(Dog):
    price = .0   #狗的價格

    #初始化
    def __init__(self,name,color,kind,price):
        Dog.__init__(self,name,color,kind)
        self.price = price

    #覆寫父類方法(重寫)
    def printInfo(self):
        print('狗的品種是:',self.kind,',價格爲',self.price)

#5、多繼承
'''
語法格式:
    class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
    
    注意:
        儘量避免使用多繼承,因爲父類有相同的變量和方法,則會按照繼承的順序,
    從左到右依次匹配相應的變量和方法,導致獲取的不是自己想要的
'''
#參加跳舞比賽
class Dance():
    danceName = ''   #舞蹈名稱
    sort = 0    #舞蹈獲取的名次
    #初始化
    def __init__(self,name,sort):
        self.danceName = name
        self.sort = sort

    #比賽結果
    def result(self):
        print('我參加比賽的舞蹈名爲: %s,獲得第%s名'%(self.danceName,1))

#多繼承
class SpeakDog(SubDog,Dance):
    isSpeak = False
    def __init__(self,name,color,kind,price,danceName,sort,isSpeak):
        SubDog.__init__(self,name,color,kind,price)
        Dance.__init__(self,danceName,sort)
        self.isSpeak = isSpeak

    def printInfo(self):
        if self.isSpeak:
            print('%s是一隻會叫的狗' % self.name)
        else:
            print('%s是一隻不會叫的狗' % self.name)


#6、類屬性與方法
'''
1)類的私有屬性
    __private_attrs:兩個下劃線開頭,聲明該屬性爲私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs。

2)類的方法
    在類的內部,使用 def 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數 self,
且爲第一個參數,self 代表的是類的實例。
self 的名字並不是規定死的,也可以使用 this,但是最好還是按照約定是用 self。

3)類的私有方法
    __private_method:兩個下劃線開頭,聲明該方法爲私有方法,只能在類的內部調用 ,不能在類的外部調用。self.__private_methods
'''

#類的私有屬性實例
class CounterTest:
    __secretCount = 0  # 私有變量
    publicCount = 0    # 公開變量

    def count(self):            # 公共方法
        self.__secretCount += 1
        self.publicCount += 1
        print('這是公共方法,私有變量__secretCount的值爲:',self.__secretCount)

    def __addNum(self,a,b):    # 私有方法
        return a+b

counter = CounterTest()
counter.count()
print('公有變量publicCount的值爲:',counter.publicCount)
# print(counter.__secretCount)  # 報錯,實例不能訪問私有變量


#程序入口
if __name__ == '__main__':
    # 實例化類
    dog = Dog('小黑','黑色','哈士奇')
    print(dog.name, dog.color, dog.kind)

    subDog = SubDog('小布丁','棕色','泰迪',1239.2)
    subDog.printInfo()  #子類調用重寫方法
    print("調用父類重寫的方法:",end='')
    super(SubDog,subDog).printInfo()  #用子類對象調用父類已被覆蓋的方法

    speakdog = SpeakDog('小布丁','棕色','泰迪',1239.2,'恭喜發財',1,True)
    speakdog.printInfo()
    speakdog.result()

結果:

C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\python.exe F:/python-space/test/ObjectStudy.py

1、Python3 面向對象

2、類定義

3、類對象
這是公共方法,私有變量__secretCount的值爲: 1
公有變量publicCount的值爲: 1
小黑 黑色 哈士奇
狗的品種是: 泰迪 ,價格爲 1239.2
調用父類重寫的方法:狗的品種是: 泰迪
小布丁是一隻會叫的狗
我參加比賽的舞蹈名爲: 恭喜發財,獲得第1名

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章