1.class 語句python
class語句細節python3.x
class語句如何獲得命名空間函數
class語句通常形式 工具
## 根據上述所言,className是類對象的一個引用
class className(superclass1,superclass2,...):
''' 定義類屬性,屬於全部實例的共享數據,經過類語句下進行定義和建立 '''
class_attr = value
''' 定義實例方法以及實例屬性 '''
def method(self,data): ## 定義實例方法
self.attr = data ## 設置實例屬性,經過帶有self的方法來分配屬性信息複製代碼
2.方法優化
實例方法對象調用等價於類方法函數調用ui
## python自動將實例方法的調用自動轉成類方法函數,並傳遞實例對象做爲第一個參數傳遞
class Person:
def study(self,name):
print("%s study method in for %s" % (name,self.__class__.__name__)
>>> p = Person()
>>> p.study("keithl")
keithl study method in for Person
>>> Person.study(p,"keithl")
keithl study method in for Person
## instance.method(arg1,arg2,...) == class.method(instance,arg1,arg2,...)複製代碼
調用超類的構造函數
__init__
方法spa
class Person:
def __init__(self):
print("call person init ....")
class Student(Person):
pass
>>> s = Student() ## 建立子類時會調用父類構造函數,緣由是子類沒有定義本身的構造函數
call person init ....
## 爲子類增長構造函數
class Student(Person):
def __init__(self):
print("call student init ....")
>>> s = Student() ## 只輸出子類的__init__方法,並無調用父類方法,緣由在於python是根據命名空間來執行調用方法
call student init ....
## 若要調用父類構造方法則必須顯示進行調用
class Student(Person):
""" 必須在子類構造函數中顯式調用父類的構造函數,並傳遞子類的self引用 """
def __init__(self):
print("call student init start....")
Person.__init__(self)
print("call student init end....")
>>> s = Student()
call student init start....
call person init ....
call student init end....複製代碼
靜態方法code
## person.py
class Person:
num = 1
""" 定義一個沒有帶參數的普通方法 """
def printNum():
Person.num += 1
print("the number is %s" % Person.num)
printNum = staticmethod(printNum) ## 聲明爲靜態方法
""" 定義一個帶參數的普通方法,此參數爲類對象參數 """
def clsPrintNum(cls):
Person.num += 1
print("the number is %s" % Person.num)
clsPrintNum = classmethod(clsPrintNum) ## 聲明爲類方法
>>> Person.printNum()
the number is 2
>>> Person.clsPrintNum()
the number is 3
## person.py 使用裝飾器來聲明靜態或類方法
class Person:
num = 1
@staticmethod
def printNum():
Person.num += 1
print("the number is %s" % Person.num)
@classmethod
def clsPrintNum(cls):
Person.num += 1
print("the number is %s" % Person.num)複製代碼
靜態方法、類方法與實例方法cdn
class Person:
@staticmethod
def static_method():
print("static method ...")
@classmethod
def class_method(cls):
print("class method ....")
def instance_method(self):
print("instance method ...")
''' python3.x能夠調用下面的函數,能夠說是靜態方法,但嚴格意義上是屬於類的一個行爲方法,可是python2.x沒法該方法 '''
def fn():
print("just a fn,if py3.x,it is static method")
## 總結:
1)在類中定義方法必定要規範化,明確是靜態方法仍是類方法抑或是實例方法
2)避免使用最後一種方式在類中定義方法複製代碼
3.命名空間與做用域對象
無點號運算的變量名稱
X = "global X"
def enclosing_fn():
## global X
X = "enclosing fn" ## 建立當前enclosing_fn的本地變量X若是沒有聲明爲全局變量的話複製代碼
X = "global X"
def enclosing_fn():
X = "enclosing fn" ## 若是註釋此行,將打印全局的變量X
print(X)
def local_x()
x = "local x" ## 若是僅註釋此行,將會打印嵌套的變量X
print(x)
local_x()複製代碼
點號的屬性變量名稱
>>> p = Person()
## 在對象實例的命名空間建立或更改屬性名稱name
p.name = "keithl" ## 並沒有進行變量名稱的搜索
## 在類的命名空間中建立或更改屬性名稱name
Person.name = "keithl" ## 並沒有進行變量名稱的搜索複製代碼
>>> p = Person()
>>> p.name ## 從對象命名空間開始按照繼承樹來搜索
>>> Person.name ## 從類的命名空間開始按照繼承樹來搜索複製代碼
命名空間字典
__dict__
來顯示__class__
屬性連接__bases__
屬性連接,能夠經過遞歸往上遍歷超類__dict__
查看模塊、類或者對象的屬性信息類與模塊的關係總結
類
模塊
喜歡能夠關注我我的公衆號,持續更新工程師技術平常