日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python类的方法三种访问权_Python基础33-面向对象(继承资源(属性与方法)的使用注意)...

發(fā)布時(shí)間:2025/3/15 python 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python类的方法三种访问权_Python基础33-面向对象(继承资源(属性与方法)的使用注意)... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。