我找到了一种方法,如下实例:
将实例方法改为类方法即可达到我想要的结果。
class MyClassA:
name = 'MyClassA'
def __init__(self):
self.name = 'instance name'
self.print_name()
pass
@classmethod
def print_name(cls):
name = cls.name
print(name)
@classmethod
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'
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()
我想在子类中调用父类实例的方法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):
File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3437, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-3-0a688d5bfaa6>", line 20, in <module>
c1 = MyClassB()
File "<ipython-input-3-0a688d5bfaa6>", line 3, in __init__
self.print_name()
File "<ipython-input-3-0a688d5bfaa6>", line 7, in print_name
name = super().name
AttributeError: 'super' object has no attribute 'name'
最佳答案
super().name
正在父类上查找名为 name
的属性 - 即 MyClassA
- 该属性显然不存在.
由于您已将属性name
添加到MyClassB
,您应该将其作为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
但变为 b
对于 MyClassB
那么你需要在实例化时覆盖它:
class MyClassB(MyClassA):
def __init__(self):
# Call the parent class' super method (sets name == a)
super().__init__()
# Override name
self.name = 'b'
关于python - 如何调用父类的实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69153175/