Python 面向對象相關
阿新 • • 發佈:2018-07-31
png self string lis pre 處理 father field ril
1. 類基本定義
- 默認構造器為只有一個self參數,內容只有一行pass。
- 方法:
- 實例方法:以實例本身
self
作為第一個參數。 - 類方法:以類對象本身
cls
作為第一個參數,以@classmethod
修飾。 - 靜態方法:參數無要求,以
@staticmethod
修飾。
- 實例方法:以實例本身
- 變量:
- 實例變量:以
self.
開頭的變量。 - 類變量:在類定義後、方法外定義的變量。
- 變量的引用:
- 類變量:
self.__class__.class_field_name
:這種方法肯定成功。self.class_field_name
:如果成員變量中沒有與類變量同名的變量,則該方法也可以調用類變量。class_name.class_field_name
- 成員變量:
self.instant_field_name
。
- 類變量:
- 實例變量:以
class Foo:
# 定義類變量
class_field = "class field"
field = "class normal field"
def __init__(self, x, y=1):
# 構造器定義,默認構造器為無參數,內容只有一行pass
# 可以設置參數,如上,則x必填,y選填
# 只能有一個構造器
print("Foo constructor", x, y)
# 定義成員變量
self.x = x
self.field = "instant normal field"
def instant_function(self, field="method field"):
print("實例方法")
print(self.class_field)
print(self.__class__.class_field)
# 對於同名變量的處理
print(field)
print(self.field)
print(self.__class__.field)
print(Foo.field)
@classmethod
def class_function(cls):
print("類方法")
@staticmethod
def static_function():
print("靜態方法")
foo = Foo(1)
foo.instant_function()
# 輸出
# Foo constructor 1 1
# 實例方法
# class field
# class field
# method field
# instant normal field
# class normal field
# class normal field
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
2. 超類相關
- 若子類不顯示定義構造器,則默認調用父類構造器。
- 子類顯示定義了父類方法/構造器後,不管參數列表是否相同,都會覆蓋父類方法/父類構造器。
- 此處的方法包括實例方法、類方法、靜態方法。
__mro__
class Father:
@classmethod
def class_method(cls, message):
print(‘Father class method‘, message)
@staticmethod
def static_method():
print(‘Father static method‘)
def __init__(self):
print(‘father constructor‘)
def method1(self, message):
print(‘Father method1‘, message)
def method2(self, message):
print(‘Father method2‘, message)
class Son(Father):
@classmethod
def class_method(cls):
print(‘Son class method‘)
@staticmethod
def static_method(message):
print(‘Son static method‘, message)
def __init__(self, x, y=2):
# 就算不調用父類也沒關系
# super方式調用父類構造器
super(Son, self).__init__()
print(‘son constructor‘)
def method1(self):
# 與父類方法名相同,參數不同
# 直接覆蓋父類方法
print(‘Son method1‘)
def method2(self, message):
# 與父類方法名相同,參數相同
# 覆蓋父類方法
# 調用父類方法
# super方式調用父類方法
super(Son, self).method2(message)
print(‘Son method2‘)
son = Son(1)
son.class_method()
son.static_method("son")
# 輸出
# father constructor
# son constructor
# Son class method
# Son static method son
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
3. 訪問控制
- 以雙下劃線
__
開頭的變量/方法,就是私有變量/方法。 - 私有方法不能直接以
__field_name
或__method_name
進行訪問,但可以通過_class_name__field_name
或_class_name__method_name
訪問。 - Python中沒有絕對的私有。
- 單下劃線:雖然不是私有的,但應被看作私有。如果有單下劃線函數
_method()
,則:- 在別的模塊使用
from somemodule import _method
導入方法成功。 - 在別的模塊使用
from somemodule import *
則不會導入_method
方法。
- 在別的模塊使用
class Foo:
__class_field_name = ‘private class field name‘
def __init__(self):
__instant_field_name = ‘private instant field name‘
def __private_method(self):
print(‘private method‘)
foo = Foo()
print(foo._Foo__class_field_name) #
foo._Foo__private_method()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
4. 鴨子類型(Duck Typing)
- 定義:動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由當前方法和屬性的集合決定。這個概念的名字來源於由James Whitcomb Riley提出的鴨子測試,“鴨子測試”可以這樣表述:“當看到一只鳥走起來像鴨子、遊泳起來像鴨子、叫起來也像鴨子,那麽這只鳥就可以被稱為鴨子。”
5. 對象信息
- type方法:獲取對象類型。
- isinstance方法:判斷的對象類型(包括繼承)
- dir方法:獲取對象所有屬性和方法。(結果為list
- 有意向的朋友可以加扣扣群813622576一起交流學習,群內有免費資料給大家
Python 面向對象相關