Python:从子类更改父类属性

标签 python class syntax

在 python (v3.6.1) 中,我希望编写一个这样的类:

class SecondClass(FirstClass):
    property = "custom"

print(SecondClass.name) #=> "john"

class SecondClass(FirstClass):
    property = "notcustom"

print(SecondClass.name) #=> "steve"

我尝试像这样设置 FirstClass 类:

class FirstClass:
    if property == "custom":
        name = "john"
    else:
        name = "steve"

但我似乎无法从 SecondClass 编辑 FirstClass 的属性。

这可能吗?

最佳答案

由于您使用的是 Python 3.6,因此您可以使用新的 __init_subclass__ 来完成您的要求。方法。来自 __init_subclass__ 的文档:

This method is called whenever the containing class is subclassed. cls is then the new subclass. If defined as a normal instance method, this method is implicitly converted to a class method.

class FirstClass:
    def __init_subclass__(cls):
        super().__init_subclass__()
        if cls.property == "custom":
            cls.name = "john"
        else:
            cls.name = "steve"

class SecondClass(FirstClass):
    property = "custom"

print(SecondClass.name)

class SecondClass(FirstClass):
    property = "notcustom"

print(SecondClass.name) 

对于适用于 Python 3.5 及更低版本的方法,您可以使用一些元类魔法:

class FirstClass(type):
    def __init__(cls, name, bases, attrs):
        if cls.property == "custom":
            cls.name = "john"
        else:
            cls.name = "steve"
        super(FirstClass, cls).__init__(name, bases, attrs)

class SecondClass(metaclass=FirstClass):
    property = "custom"

print(SecondClass.name)

class SecondClass(metaclass=FirstClass):
    property = "notcustom"

print(SecondClass.name)

关于Python:从子类更改父类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45716412/

相关文章:

python - 从标准输入管道到 bash 脚本中的 python 代码

python - 使用按钮在具有参数化类的面板中触发操作,当按钮操作完成时更新另一个依赖项 (Holoviz)

python - 我可以切换这个函数 vanilla.count()

python - 如何在类中使用 pyglet

python - 使用 'struct_name.*' 选择时为所有列提供前缀

python - 如何从 pandas 的列子集中选择行子集

java - 解析 .java 文件以提取所有特征

Vim 语法递归匹配第一个和第二个元素

syntax - 在scala中解析嵌套元组的错误

ios - '.' 和 '->' iOS 有什么区别?