python类的方法三种访问权_Python基础33-面向对象(继承资源(属性与方法)的使用注意)...
在Python中, 繼承是指子類(lèi)對(duì)父類(lèi)資源的使用權(quán)
1 繼承-屬性與方法的使用權(quán)限
1.1 測(cè)試屬性與方法分別如下
公有屬性/方法
受保護(hù)屬性/方法
私有屬性/方法
class Animal:
a = 1 # 公有屬性
_b = 2 # 受保護(hù)屬性
__c = 3 # 私有屬性
#公有方法
def t1(self):
print("t1")
# 受保護(hù)方法
def _t2(self):
print("t2")
# 私有方法
def __t3(self):
print("t3")
# 內(nèi)置方法
def __init__(self):
print("init, Animal")
class Person(Animal):
# 在實(shí)例對(duì)象(子類(lèi))內(nèi)對(duì)以上屬性及方法的訪問(wèn)權(quán)限
def test(self):
print(id(self.a)) # 打印地址的目的是為了證明子類(lèi)對(duì)父類(lèi)屬性繼承是`可以使用`,而非`擁有副本`
print(self.a)
print(self._b)
# print(self.__c) # 不能訪問(wèn)私有屬性
self.t1()
self._t2()
# self.__t3() # 不能訪問(wèn)私有方法
self.__init__()
p = Person()
p.test()
print(id(Animal.a))
p.test()
>>>> 打印結(jié)果
init, Animal
4502964848
1
2
t1
t2
init, Animal
4502964848
4502964848
1
2
t1
t2
init, Animal
除私有的屬性和私有的方法, 其他屬性和方法子類(lèi)基本都能繼承(具有使用權(quán))
2 繼承-通過(guò)子類(lèi)給父類(lèi)屬性進(jìn)行賦值時(shí),默認(rèn)是指給之類(lèi)增加一個(gè)與父類(lèi)同名的屬性
class Father:
age = 10
class Son(Father):
pass
print(Son.age) # 訪問(wèn)父類(lèi)屬性
Son.age = 9 # 給子類(lèi)增加與父類(lèi)同名屬性
print(Son.age)
print(Father.age)
print(Son.__dict__)
print(Father.__dict__)
>>>>打印結(jié)果
10
9
10
{'__module__': '__main__', '__doc__': None, 'age': 9}
{'__module__': '__main__', 'age': 10, '__dict__': , '__weakref__': , '__doc__': None}
3 繼承的3種形態(tài)
繼承的3種形態(tài)
4 幾種形態(tài)應(yīng)該遵循的標(biāo)準(zhǔn)原則
4.1 單繼承
遵循"從下到上的原則"
自己身上沒(méi)有這個(gè)資源, 就到父類(lèi)里面去找,父類(lèi)里面沒(méi)有再往上找
4.2 無(wú)重疊的多繼承
遵循"單調(diào)原則"
按照繼承的先后順序,優(yōu)先調(diào)用左側(cè)繼承鏈上的資源
4.3 有重疊的多繼承
遵循"從下到上的原則"
簡(jiǎn)單理解就是:
A繼承B繼承C
B重寫(xiě)了C類(lèi)的方法, 那么A優(yōu)先使用B類(lèi)的方法
4 查看類(lèi)的資源查找順序方法
通過(guò)inspect模塊進(jìn)行
目的:假如繼承鏈中多個(gè)父類(lèi)重寫(xiě)的資源,要學(xué)會(huì)查找哪些類(lèi)的重寫(xiě)資源會(huì)被優(yōu)先調(diào)用
# 導(dǎo)入資源查看模塊 inspect
import inspect
class D(object):
pass
class B(D):
pass
class C(D):
pass
class A(B, C):
pass
# 方法一
print(inspect.getmro(A))
# 方法二
print(A.__mro__)
# 方法三
print(A.mro())
>>>>打印結(jié)果
(, , , , )
(, , , , )
[, , , , ]
TODO:《 針對(duì)于幾種標(biāo)準(zhǔn)原則的方案演化》
不同 Python 版本 MRO 原則
菱形繼承鏈問(wèn)題
5 資源覆蓋(MRO 優(yōu)先級(jí)高的優(yōu)先調(diào)用)
5.1 原理
基于MRO的資源檢索鏈
優(yōu)先級(jí)高的類(lèi)具有一個(gè)與優(yōu)先級(jí)低的類(lèi)一樣的一個(gè)資源(屬性或方法)
會(huì)先選擇優(yōu)先級(jí)高的資源 ,而摒棄優(yōu)先級(jí)低的資源(造成"覆蓋"的假象)
class D(object):
age = "d"
pass
class C(D):
age = "c"
def test(self):
print("c")
pass
class B(D):
# age = "b"
def test(self):
print("b")
pass
class A(B, C):
pass
a = A()
a.test()
print(A.mro())
print(A.age)
print(A().test())
>>>>打印結(jié)果
b
[, , , , ]
c
b
None
5.2 調(diào)用優(yōu)先級(jí)高資源時(shí),self 與 cls 的變化
結(jié)論:誰(shuí)調(diào)用,就是誰(shuí)
class D(object):
pass
class C(D):
def test(self):
print(self)
pass
class B(D):
def test(self):
print(self)
@classmethod
def test2(cls):
print(cls)
pass
class A(B, C):
pass
A.test2()
a = A()
a.test()
>>>>打印結(jié)果
6 在低優(yōu)先級(jí)類(lèi)的方法中,通過(guò)"super"調(diào)用高優(yōu)先級(jí)類(lèi)的方法
Python3.x
class B:
a = 1
def __init__(self):
self.b = 2
self.xxx = "123"
def t1(self):
print("t1")
@classmethod
def t2(cls):
print(cls)
print("t2")
@staticmethod
def t3():
print("t3")
class A(B):
c = 3
def __init__(self):
super().__init__()
self.e = "666"
def tt1(self):
print("tt1")
@classmethod
def tt2(cls):
super().t2()
print("tt2")
@staticmethod
def tt3():
print("tt3")
pass
a = A()
print(a.__dict__)
print("-" * 20)
A.tt2()
>>>>打印結(jié)果
{'b': 2, 'xxx': '123', 'e': '666'}
--------------------
t2
tt2
Python2.2+
class B:
a = 1
def __init__(self):
self.b = 2
self.xxx = "123"
def t1(self):
print("t1")
@classmethod
def t2(cls):
print(cls)
print("t2")
@staticmethod
def t3():
print("t3")
class A(B):
c = 3
def __init__(self):
super(A, self).__init__()
self.e = "666"
def tt1(self):
print("tt1")
@classmethod
def tt2(cls):
super(A, cls).t2()
print("tt2")
@staticmethod
def tt3():
print("tt3")
pass
a = A()
print(a.__dict__)
print("-" * 20)
A.tt2()
>>>>打印結(jié)果
{'b': 2, 'xxx': '123', 'e': '666'}
--------------------
t2
tt2
注意
super 和父類(lèi)(超類(lèi))沒(méi)有實(shí)質(zhì)性的關(guān)聯(lián)
僅僅是沿著MRO鏈條, 找到下一級(jí)節(jié)點(diǎn)
保證調(diào)用形式的統(tǒng)一
要是類(lèi)名調(diào)用, 全是類(lèi)名調(diào)用
要是super調(diào)用, 全是super調(diào)用
(混合使用容易出現(xiàn)死循環(huán))
總結(jié)
以上是生活随笔為你收集整理的python类的方法三种访问权_Python基础33-面向对象(继承资源(属性与方法)的使用注意)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对extern C的一点小认识
- 下一篇: websocket python爬虫_p