我正在學習python的@property裝飾器。我被卡住了,找不到解決辦法。我檢查了SO中的這個和這個,但我的問題是不同的。
在這里,我創建了一個Base類,其中我使用@property裝飾器將函式fun_name作為該Base類的一個屬性。一切都按預期進行。
我想知道在繼承的情況下這是什么行為。
為此,我創建了另一個類Derived,它是由Base類派生出來的。在Derived類中,我試圖使用Derived類的成員函式sample_fun訪問屬性函式fun_name。
使用Base類物件(obj1)直接訪問fun_name屬性,如期作業。但是當我使用Derived類的成員函式sample_fun使用obj2物件呼叫同樣的行為時,我感到困惑。
class Base:
def __init__(self,name):
self.name = name
@propertydef fun_name(self)。
print("Entered the getter fun_name")
return "Getter-> Hello {}".format(self.name)。
@fun_name.setter。
def fun_name(self,str)。
self.name = str.
print("Setter-> Hello {}"/span>.format(self.name))
def fun_name1(self)。
print("Hello from fun_name1 {}"/span>.format(self.name)
class Derived(Base)。
def sample_fun(self)。
print("直接呼叫base的fun")
Base.fun_name1(self)
print("It works")
print("直接呼叫base attrib")
Base.fun_name #Here Why it is not entering into the fun_name? .
print("它在這里列印但不進入fun_name")
obj1 = Base("Joe")
obj1.fun_name
obj1.fun_name = "Jim"/span>
obj1.fun_name
obj2 = Derived("RAJ")
obj2.sample_fun()
控制臺輸出:
輸入了getter fun_name
Setter-> Hello Jim
輸入getter fun_name
直接呼叫基礎呼叫fun
Hello from fun_name1 RAJ
它是有效的
直接呼叫基數attrib
它在這里列印,但沒有進入fun_name中
正如你所看到的,當我使用Base類物件(obj1)直接訪問它時,它進入了該函式。
但是同樣的行為沒有發生在Derived類的成員函式中。正是在sample_fun方法中的Base.fun_name位置。
我在這里是否遺漏了一些重要的概念?
uj5u.com熱心網友回復:
@property添加了一個在屬性訪問時被觸發的實體方法。注意self的引數。它在類上添加了一個屬性物件。當你訪問該類的一個實體時,python將呼叫該方法并將該類的實體傳遞給它。
Base.fun_name是該類上的實際屬性物件。如果你做了Base().fun_name,它就會像你期望的那樣作業。如果Base.fun_name真的被呼叫,它將拋出一個例外,因為沒有self可以被傳遞。
uj5u.com熱心網友回復:
@Paul Becotte已經為我的問題提供了一個很好的解決方案。我發現還有一種方法(反正已經存在)可以訪問我需要的相同功能。因為Derived類已經衍生自Base類。因此,這個Base類的所有屬性都可以在Derived類中使用。所以我的問題是,如何使用Derived類的成員函式sample_fun訪問屬性函式fun_name。
我最初的想法是這樣呼叫的:
Base.fun_name #This was wrong and Paul already gave an explanation on this.
@Paul的建議是:
Base("ANY NAME").fun_name #這樣做是對的,他也給出了解釋。
我的另一個解決方案(用self呼叫,因為它是從Base派生的):
self.fun_name #This solution also worked since the Derived class is derived from Base.
多謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320082.html
標籤:
上一篇:遺傳自有相同成員的父母
