【问题标题】:Accessing Parent Class Attributes in Child Class as classmethod作为类方法访问子类中的父类属性
【发布时间】:2023-02-04 06:07:40
【问题描述】:

我有以下代码可以正常工作:

class Person:
    def __init__(self, fname, lname) -> None:
        self.firstname = fname
        self.lastname = lname

    def __repr__(self) -> str:
        return f'{self.firstname} {self.lastname}'

class Student(Person):
    def __init__(self, fname, lname, year) -> None:
        super().__init__(fname, lname)
        self.gradyear = year

    def __repr__(self) -> str:
        return f'{self.firstname} {self.lastname} passed in {self.gradyear}'

    def welcome(self):
        print(f'Welcome, {self.firstname} {self.lastname} you passed out in {self.gradyear}')

x = Person("John", "Doe")
y = Student("John", "Doe", 1988)

y.welcome()

但是,我希望将最后一个方法 - 欢迎 - 定义为类方法。因此,如果我进行以下更改,代码将失败。

class Person:
    def __init__(self, fname, lname) -> None:
        self.firstname = fname
        self.lastname = lname

    def __repr__(self) -> str:
        return f'{self.firstname} {self.lastname}'

class Student(Person):
    def __init__(self, fname, lname, year) -> None:
        super().__init__(fname, lname)
        self.gradyear = year

    def __repr__(self) -> str:
        return f'{self.firstname} {self.lastname} passed in {self.gradyear}'

    @classmethod
    def welcome(cls):
        print(f'Welcome, {cls.firstname} {cls.lastname} you passed out in {cls.gradyear}')

x = Person("John", "Doe")
y = Student("John", "Doe", 1988)

y.welcome()

我收到如下错误:

AttributeError: type object 'Student' has no attribute 'firstname'

我意识到 Python 正在查看子类 - Student 的属性。但是,通过继承,它还应该查看 Parent,它应该在哪里找到属性。

我在这里错过了什么?

【问题讨论】:

    标签: python python-3.x class methods


    【解决方案1】:

    如果方法被标记为@classmethod,它只能访问类而不是类的实例。这意味着您无权访问实例变量。它与继承无关,您甚至无法在该方法中访问 gradyear 属性。这意味着 __init__() 中设置的任何变量都不能被 @classmethod 访问。您可以阅读更多关于@classmethodhere的信息。

    【讨论】:

    • 谢谢你。这说明了。我将我的问题标记为已解决。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2016-02-11
    相关资源
    最近更新 更多