Python 3 學習筆記之——物件導向

seniusen發表於2018-10-27

1. 類的介紹

類(Class) 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類的例項,類是物件的抽象。

  • 方法:類中定義的函式。
  • 類變數:類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。
  • 方法變數:定義在方法中的變數。
  • 繼承:即一個派生類(derived class)繼承基類(base class)的屬性和方法。
  • 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也成為方法的重寫。

2. 類的定義

語法格式如下:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>
複製程式碼
  • 類有一個名為 _init_() 的特殊方法,也即是建構函式,該方法會在定義物件的時候自動呼叫,可以通過引數傳遞來對類的例項進行設定。

  • 在類內部,使用 def 關鍵字來定義一個方法,與一般函式不同,類方法必須包含引數 self,並且作為第一個引數,self 代表類的例項,類似於 C++ 中的 this 指標。

  • 類的私有屬性 __private_attrs 以兩個下劃線開頭,在類內部的方法中使用時用 self.__private_attrs 呼叫,不能在類外部訪問類的私有屬性。

  • 類的私有方法 __private_method 以兩個下劃線開頭,只能在類的內部呼叫,不能在類外部呼叫。

class person:
    
    instances = 0                # 類變數,所有類公用
    
    def __init__(self, name, age, weight):
        self.name = name         # 公有屬性
        self.age = age
        self.__weight = weight   # 私有屬性,在類外無法直接訪問
        
        person.instances += 1;   # 通過類來訪問類變數
    
    def tell_a_secret(self):     # 私有方法
        print("Tell you a secret, my weight is {} kg.".format(self.__weight))
    
    def speak(self):             # 公有方法
        print('My name is {}, I\'m {} years old.'.format(self.name, self.age))
        self.tell_a_secret()


people = person('seniusen', 21, 60)
people.speak()
print(people.instances)
print(people.instances) # 通過例項也可以訪問類變數

# My name is seniusen, I'm 21 years old.
# Tell you a secret, my weight is 60 kg.
# 1
# 1
複製程式碼

3. 類的單繼承

語法格式如下:

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>
複製程式碼
  • 注意圓括號中基類的順序,若是基類中有相同的方法名,而在子類使用時未指定,則 Python 從左至右進行搜尋。即方法在子類中未找到時,從左到右查詢基類中是否包含該方法

  • 基類名 BaseClassName 必須與派生類定義在一個作用域,如果基類定義在另一個模組,這時候我們還可以用一個表示式來定義派生類,class DerivedClassName(modname.BaseClassName):

class student(person):
        
    def __init__(self, name, age, weight, major):
        
        person.__init__(self, name, age, weight) # 呼叫父類的建構函式,此時必須給定 self 引數
        # super(student, self).__init__(name, age, weight) 或者利用 super() 函式
        self.major = major

    # 重寫父類的方法
    def speak(self): # 公有方法
        person.speak(self)
        print('My major in college is {}.'.format(self.major))

stu = student('seniusen', 21, 60, 'Automation')
stu.speak()
print(student.instances)
print(stu.instances) # 通過例項也可以訪問類變數

# My name is seniusen, I'm 21 years old.
# Tell you a secret, my weight is 60 kg.
# My major in college is Automation.
# 2
# 2
複製程式碼

3. 類的多繼承

語法格式如下:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
複製程式碼
class teacher:
      
    def __init__(self, title, topic):
        self.title = title 
        self.topic = topic
    
    def speak(self): # 公有方法
        print('I\'m a {} , my research topic is {}.'.format(self.title, self.topic))

# 繼承自 teacher 和 student 的子類
class sample(teacher, student):
    
    def __init__(self, name, age, weight, major, title, topic):
        student.__init__(self, name, age, weight, major)
        teacher.__init__(self, title, topic)

test = sample('seniusen', 21, 60, 'Automation', 'prefessor', 'CV')
test.speak() # 沒有指定方法,從左到右查詢,這裡呼叫了 teacher 類的 speak() 方法

# I'm a prefessor , my research topic is CV.

複製程式碼
  • 利用 super() 函式可以呼叫被子類重寫的父類中的方法。
class Parent:           # 定義父類
    
    def myMethod(self):
        print ('Method form Parent class!')

        
class Child(Parent):    # 定義子類
    
    def myMethod(self):
        print ('Method form Child class!')

a = Child()                # 子類例項
a.myMethod()               # 子類呼叫重寫方法
super(Child, a).myMethod() #用子類物件呼叫父類已被覆蓋的方法

# Method form Child class!
# Method form Parent class!

複製程式碼

參考資料 菜鳥教程

獲取更多精彩,請關注「seniusen」!

Python 3 學習筆記之——物件導向

相關文章