如何调用父类的实例方法?

How to call the instance method of the parent class?

提问人:jaried 提问时间:9/13/2021 最后编辑:jaried 更新时间:9/13/2021 访问量:77

问:

我找到了一种方法,如下实例:

将实例方法更改为类方法以达到我想要的结果。

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'
Python Super

评论

0赞 anon01 9/13/2021
这有点不寻常。你到底想达到什么目的?
0赞 jaried 9/13/2021
@anon01我想设置,怎么办?MyClassB.name='class name'

答:

2赞 match 9/13/2021 #1

super().name正在寻找在父类上调用的属性 - 即 - 这显然不存在。nameMyClassA

由于您已将属性添加到,因此您应该将其访问为 - 例如:nameMyClassBself.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,那么你需要在实例化时覆盖它:nameabMyClassB

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.nametype(self).namename
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__MyClassAsuper()