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

标签 python class super

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

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

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/

相关文章:

python - 如何在 SQLAlchemy 中插入到 t1 (SELECT * FROM t2)?

python - 作业,Python 3 : Changing a Variable Type From Within a Function

python - 如何在 Gnome 终端中对 Python 错误的输出进行着色?

python - 当 LSTM 层的输入数量大于或小于该层中 LSTM 单元的数量时,Keras 会做什么?

java - 传递一个类并调用它的方法

java - 子类构造函数中的 super 有何作用?

java - java中使用super(),小时工方法

PHP:从类中调用类函数

java - 为什么说在class dog中的构造函数dog无法应用于给定类型?它似乎可以运行,但是会引发错误,那是为什么?

JavaScript 对象方法使用 super 关键字