我找到了一個方法,如下實體 :
將實體方法改為類方法,以達到我想要的結果。
class MyClassA:
name = 'MyClassA'。
def __init__(self):
self.name = 'instance name'pass
@classmethod
def print_name(cls)。
name = cls.name
print(name)
@classmethod: name = cls.name.
def init(cls)。
cls.name = 'class name'。
class MyClassB(MyClassA)。
pass。
MyClassB.init()
c1 = MyClassB()
我想設定MyClassB.name='class name'并獲得MyClassB.name。
如何修改代碼?
class MyClassA。
name = 'MyClassA'。
def __init__(self):
self.name = 'instance name'pass
def print_name(self)。
name = super().name
print(name)
@classmethod
def init(cls)。
cls.name = 'class name'。
class MyClassB(MyClassA)。
pass。
MyClassB.init()
c1 = MyClassB()
我想在子類中呼叫父類實體的方法c1.print_name()。
如何修改代碼以獲得輸出:'class name'
我的代碼如下:
class MyClassA:
def __init__(self):
self.print_name()
pass
def print_name(self)。
name = super().name
print(name)
@classmethod
def init(cls)。
cls.name = 'class name'。
class MyClassB(MyClassA)。
pass。
MyClassB.init()
c1 = MyClassB()
錯誤如下:
Traceback (most recent call last):
檔案 "D:Anaconda3libsite-packagesIPythoncoreinteractiveshell.py", line 3437, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
檔案"<ipython-input-3-0a688d5bfaa6>",行20,in<module>。
c1 = MyClassB()
檔案 "<ipython-input-3-0a688d5bfaa6>", line 3, in __init__
self.print_name()
檔案 "<ipython-input-3-0a688d5bfaa6>", line 7, in print_name
name = super().name
屬性錯誤(AttributeError)。'super' object沒有屬性'name'。
uj5u.com熱心網友回復:
super().name正在尋找父類--即MyClassA上一個叫做name的屬性,而這個屬性顯然不存在。
既然你已經為MyClassB添加了name屬性,你應該以self.name的形式來訪問它 - 例如:
class MyClassA。
def __init__(self):
self.print_name()
pass
def print_name(self)。
name = self.name
print(name)
@classmethod
def init(cls)。
cls.name = 'class name'。
class MyClassB(MyClassA)。
pass。
為了回答你新的 "上層 "問題,如果你想設定一個特定的name屬性,默認為a,但對于MyClassB來說則變成b,那么你需要在實體化的時候覆寫這個:
class MyClassB(MyClassA)。
def __init__(self)。
# Call the parent class' super method (set name == a)
super().__init__()
# Override name
self.name = 'b'。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/310486.html
標籤:
上一篇:如何防止在C 中創建一個物件
下一篇:互相設定自變數
