先來一段代碼
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
class A:
def bar(self):
print("BAR")
self.f1()
class B(A):
def f1(self):
print("B")
class C:
def f1(self):
print("C")
class D(C, B):
pass
obj = D()
obj.bar()
執(zhí)行結(jié)果
/usr/bin/python3.5 /home/ansheng/文檔/Python_code/sublime/Week06/Day03/s1.py
BAR
C
Process finished with exit code 0
流程釋意:
創(chuàng)建了類A、B、C、D;
D
繼承了C
和B
,B
繼承了A
,D
內(nèi)什么都不做,pass
;
創(chuàng)建一個對象obj
,類是D
,當執(zhí)行D
的bar
方法的時候會先從C
里面尋找有沒有bar
方法;
C
內(nèi)沒有bar
方法,然后繼續(xù)從B
里面查找,B
里面也沒有,B
的父類是A
,A
里面有bar
方法,所以就執(zhí)行了A
的bar
方法;
A
的bar
方法首先輸出了BAR
;
然后又執(zhí)行了self.f1()
,self
=obj
,相當于執(zhí)行了obj.f1()
;
執(zhí)行obj.f1()
的時候先從C
里面查找有沒有f1
這個方法,C
里面又f1
這個方法;
最后就執(zhí)行C
里面的f1
方法了,輸出了C
lass Annimal:
def __init__(self):
print("Annimal的構(gòu)造方法")
self.ty = "動物"
class Cat(Annimal):
def __init__(self):
print("Cat的構(gòu)造方法")
self.n = "貓"
# 尋找Cat類的父類,然后執(zhí)行父類的構(gòu)造方法
super(Cat, self).__init__()
mao = Cat()
print(mao.__dict__)
執(zhí)行結(jié)果
/usr/bin/python3.5 /home/ansheng/文檔/Python_code/sublime/Week06/Day03/s1.py
Cat的構(gòu)造方法
Annimal的構(gòu)造方法
{'ty': '動物', 'n': '貓'}
Process finished with exit code 0
先執(zhí)行了Cat的構(gòu)造方法,然后又執(zhí)行了Annimal的構(gòu)造方法。
第二種執(zhí)行父類的方法如下:
Annimal.__init__(self)
不推薦使用
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
class Foo:
def __init__(self, name):
self.name = name
def show(self):
print('show')
obj = Foo("as")
# 如果是類,就只能找到類里的成員
print(hasattr(Foo, "show"))
# 如果是對象,既可以找到對象,也可以找類里的成員
print(hasattr(obj, "name"))
print(hasattr(obj, "show"))
執(zhí)行結(jié)果
/usr/bin/python3.5 /home/ansheng/文檔/Python_code/sublime/Week06/Day03/s2.py
True
True
True
Process finished with exit code 0
s1
腳本文件內(nèi)容:
#!/usr/bin/env python
# _*_coding:utf-8 _*_
# 導(dǎo)入模塊
m = __import__('s2', fromlist=True)
# 去模塊中找類
class_name = getattr(m, "Foo")
# 根據(jù)類創(chuàng)建對象
obj = class_name("ansheng")
# 去對象中找name對應(yīng)的值
print(getattr(obj, 'name')
s2
腳本文件內(nèi)容
#!/usr/bin/env python
# _*_coding:utf-8 _*_
class Foo:
def __init__(self, name):
# 普通字段,保存在對象中
self.name = name
執(zhí)行結(jié)果
/usr/bin/python3.5 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s1.py
ansheng
Process finished with exit code 0
靜態(tài)字段存在類中,如下:
#!/usr/bin/env python
# _*_coding:utf-8 _*_
# 靜態(tài)字段存在的意義就是將每個對象中重復(fù)的東西在類里面保存一份即可,這就是靜態(tài)字段
class Provice:
# 靜態(tài)字段
contry = "China"
def __init__(self, name):
self.name = name
def show(self):
print(Provice.contry, self.name)
hebei = Provice("河北")
hebei.show()
hubei = Provice("湖北")
hubei.show()
執(zhí)行結(jié)果
/usr/bin/python3.5 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py
China 河北
China 湖北
Process finished with exit code 0
類里面的成員類去訪問,對象內(nèi)的成員用對象去訪問。
#!/usr/bin/env python
# _*_coding:utf-8 _*_
class Foo:
# 靜態(tài)方法括號內(nèi)沒有self,切方法前一行要加上@staticmethod
@staticmethod
def static():
# def static(arg1, arg2): # 也可以設(shè)置參數(shù)
print("static")
# 靜態(tài)方法通過類名+方法名既可執(zhí)行
Foo.static()
# Foo.static("arg1", "arg2") 通過類調(diào)用的時候傳入對于的參數(shù)即可
# 靜態(tài)方法也可以通過對象去訪問,對于靜態(tài)方法用類去訪問
obj = Foo()
obj.static()
執(zhí)行結(jié)果
/usr/bin/python3.5 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py
static
static
Process finished with exit code 0
#!/usr/bin/env python
# _*_coding:utf-8 _*_
class Foo:
# 創(chuàng)建類方法的時候需要在方法前面加上@classmethod
@classmethod
def ClassMethod(cls): # 并且方法的括號內(nèi)必須帶有cls關(guān)鍵字,類方法的參數(shù)是當前類的類名
print("類方法")
# 調(diào)用類方法
Foo.ClassMethod()
執(zhí)行結(jié)果:
/usr/bin/python3.5 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py
類方法
Process finished with exit code 0
字段
1.靜態(tài)字段(每個對象都有一份)
2.普通字段(每個對象都不同的數(shù)據(jù))
方法
1.靜態(tài)方法(無需使用對象封裝的內(nèi)容)
2.類方法
3.普通方法(適用對象中的數(shù)據(jù))
特性
1.普通特性(將方法未造成字段)
快速判斷,類執(zhí)行、對象執(zhí)行:
1.self —> 對象調(diào)用
2.無self —> 類調(diào)用
本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!
更多建議: