提问人:jaried 提问时间:9/13/2021 最后编辑:jaried 更新时间:9/13/2021 访问量:77
如何调用父类的实例方法?
How to call the instance method of the parent class?
问:
我找到了一种方法,如下实例:
将实例方法更改为类方法以达到我想要的结果。
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'
答:
2赞
match
9/13/2021
#1
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
为了回答新的“上层”问题,如果你想设置一个特定的属性,该属性默认为,但变为 for,那么你需要在实例化时覆盖它: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'
评论
0赞
jaried
9/13/2021
如果类属性名称与实例属性名称不同,我应该怎么写?
0赞
Silvio Mayolo
9/13/2021
您始终可以显式引用类属性,即 (或),但如果你同时定义了类和实例,我可能会认为这是一个设计缺陷。MyClassB.name
type(self).name
name
0赞
jaried
9/13/2021
我修改了我的问题。
0赞
jaried
9/13/2021
@Silvio Mayolo 类和实例的属性可能不同。
0赞
match
9/13/2021
self.name = a
将在调用时覆盖。如果您希望为每个类设置不同的此属性,则需要在调用后为每个类设置自定义属性,以获取 the 'default.cls.name
__init__
__init__
MyClassA
super()
评论
MyClassB.name='class name'