Python基礎彙總003--Python面向物件即類(Class)相關的知識點彙總---類的定義、物件的建立和使用、類的屬性和方法
1.類和物件的基本概念
面向物件的思想中提出了兩個概念,即類和物件。類是對某一類事物的抽象描述,是一種抽象的資料型別,一種模板。而物件用於表示現實中該類事物的個體,也就是具體化了類的描述。它們的關係是,物件是類的具體例項,類是物件的模板。物件根據類建立,一個類可以建立多個物件。比如我定義了一個學生類,那麼通過類創建出來的小明、小王就叫物件。
(1)類的定義
在Python中使用class關鍵字定義一個類,類的主體由屬性(變數)和方法(函式)組成。通過定義一個學生類來學習下Python類的定義方法,如下:
# 類的建立 class Student(object): count = 0 #類屬性 def __init__(self, name, age): # __init__為類的建構函式 self.name = name # 例項屬性 self.age = age # 例項屬性 def output(self): # 例項方法 print(self.name) print(self.age)
上述例子中Student是類名,__init__()函式是建構函式,count、name、age是類中定義的屬性,output(self)是類中定義的方法。
(2)物件的建立和使用
定義完Student類之後,就可以建立物件。
要建立類的例項,可以使用類名呼叫該類,並傳遞其__init__
方法接受的任何引數。
# 類的建立 class Student(object): count = 0 # 類屬性 def __init__(self, name, age): # __init__為類的建構函式 self.name = name # 例項屬性 self.age = age # 例項屬性 def output(self): # 例項方法 print(self.name) print(self.age) if __name__== '__main__': stu1 = Student('Zhangsan', 18) # 使用Student類物件stu1 print("stu1.name = %s" % (stu1.name,)) # 利用物件stu1獲取物件屬性name。輸出stu1.name = Zhangsan print("stu1.age = %d" % (stu1.age,)) # 利用物件stu1獲取物件屬性age。輸出stu1.age = 18 stu1.output() # 利用物件stu1呼叫output方法。
控制檯輸出:
例項化物件之後,就可以通過物件直接呼叫物件的屬性和方法。但是注意的是物件呼叫方法時,不需要給引數self賦值,self引數用於表示指向例項物件本身。
到這裡,已經學會了類的定義和物件建立方法和使用了
2.類屬性和例項屬性
類的屬性是對資料的封裝,類中定義的屬性包括例項屬性、類屬性兩種。上述例子中count變數屬於類屬性,name、age屬於例項屬性。類變數可以在該類的所有例項中被共享。二者在定義和使用上區別主要如下:
(1)類屬性定義在類中但是在方法外的變數,例項屬性通常定義在建構函式__init__內。
# 類的建立 class Student(object): count = 0 # 類屬性 def __init__(self, name, age): # __init__為類的建構函式 self.name = name # 例項屬性 self.age = age # 例項屬性
(2)類屬性屬於類本身,可以通過類名進行訪問/修改,也可以被類的所有例項訪問/修改。
# 類的建立 class Student(object): count = 0 # 類屬性 def __init__(self, name, age): # __init__為類的建構函式 self.name = name # 例項屬性 self.age = age # 例項屬性 def output(self): # 例項方法 print(self.name) print(self.age) if __name__ == '__main__': stu1 = Student('Zhangsan', 18) # 使用Student類物件stu1 stu1.count=100 print("stu1.count = %s" % (stu1.count,)) Student.count=20 print("Student.count = %s" % (Student.count,))
控制檯輸出:
(3)例項屬性只能通過例項訪問。
# 類的建立 class Student(object): count = 0 # 類屬性 def __init__(self, name, age): # __init__為類的建構函式 self.name = name # 例項屬性 self.age = age # 例項屬性 def output(self): # 例項方法 print(self.name) print(self.age) if __name__ == '__main__': stu1 = Student('Zhangsan', 18) # 使用Student類物件stu1 print("stu1.age = %d" % (stu1.age,)) # 利用物件stu1獲取物件屬性age。輸出stu1.age = 18 print("Student.age = %d" % (Student.age,)) # 報錯,不能通過類直接訪問例項屬性
控制檯輸出:
3.例項方法、類方法和靜態方法
自定義的一個類中,可能出現三種方法,例項方法、靜態方法和類方法,下面來看下三種方法的定義和使用區別。
(1)例項方法
例項方法的第一個引數必須是"self",例項方法只能通過物件呼叫
# 類的建立 class Student(object): count = 0 # 類屬性 def __init__(self, name, age): # __init__為類的建構函式 self.name = name # 例項屬性 self.age = age # 例項屬性 def output(self): # 例項方法 print(self.name) print(self.age) if __name__ == '__main__': stu1 = Student('Zhangsan', 18) # 使用Student類物件stu1 print("stu1.age = %d" % (stu1.age,)) # 利用物件stu1獲取物件屬性age。輸出stu1.age = 18 stu1.output() # 利用物件stu1呼叫output方法。
其中output()方法即為例項方法,必須帶一個引數self,呼叫時不必給該引數賦值。
控制檯輸出:
(2)靜態方法
靜態方法使用函式@staticmethod修飾器定義。定義和使用方式如下:
# 類的建立 class Student(object): count = 0 # 類屬性 def __init__(self, name, age): # __init__為類的建構函式 self.name = name # 例項屬性 self.age = age # 例項屬性 def output(self): # 例項方法 print(self.name) print(self.age) @staticmethod # 方法一,定義類方法,呼叫類變數,getPrice中不帶self引數 def getCount(): print(Student.count) if __name__ == '__main__': stu1 = Student('Zhangsan', 18) # 使用Student類物件stu1 print("stu1.age = %d" % (stu1.age,)) # 利用物件stu1獲取物件屬性age。輸出stu1.age = 18 stu1.getCount() # 利用物件stu1呼叫getCount()方法。
對於靜態方法和類方法,可以通過類名和物件兩種方式進行呼叫。
4.類的專有方法
(1)__init__ :建構函式,在生成物件時呼叫
類有一個名為 __init__() 的特殊方法(構造方法),該方法在類例項化時會自動呼叫
# 類的建立 class Student(object): count = 0 # 類屬性 def __init__(self, name, age): # __init__為類的建構函式 self.name = name # 例項屬性 self.age = age # 例項屬性 def output(self): # 例項方法 print(self.name) print(self.age) if __name__ == '__main__': stu1 = Student('Zhangsan', 18) # 使用Student類物件stu1 print("stu1.age = %d" % (stu1.age,)) # 利用物件stu1獲取物件屬性age。輸出stu1.age = 18
(2)__call__:函式呼叫
Python中有一個有趣的語法,只要定義型別的時候,實現__call__函式,這個型別就成為可呼叫的。 換句話說,我們可以把這個型別的物件當作函式來使用,相當於 過載了括號運算子。我們可以 例項物件()
class TestCall(object): def __init__(self, name): self.name = name def __call__(self, *args, **kwargs): print("self.name: %s. " % self.name, end=' ') print('__call__() is running ') if __name__ == '__main__': call = TestCall(name='xiaoming') call() # call()與call.__call__()是等價的 call.__call__()
控制檯輸出:
參考文獻:
https://www.cnblogs.com/linyfeng/p/9185785.html