从子类主体访问父类属性?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

Klass具有类属性my_list

class Klass():
    my_list = [1, 2, 3]


class SubKlass(Klass):
    my_list = Klass.my_list + [4, 5] # this works, but i must specify parent class explicitly
    #my_list = super().my_list + [4, 5] # SystemError: super(): __class__ cell not found
    #my_list = my_list + [4, 5] # NameError: name 'my_list' is not defined 


print(Klass.my_list)
print(SubKlass.my_list)

那么,是否有一种方法可以访问父类属性而不指定其名称?

提问于
用户回答回答于

Python中的类定义工作如下。

  1. 翻译看到class语句后面跟着一段代码。
  2. 它创建一个新的命名空间并在名称空间中执行该代码。
  3. 它称之为type内置结果名称空间、类名、基类和元类(如果适用)。
  4. 它将结果分配给类名。

代码:

>>> def inherit_attribute(name, f):
...     def decorator(cls):
...             old_value = getattr(cls, name)
...             new_value = f([getattr(base, name) for base in cls.__bases__], old_value)
...             setattr(cls, name, new_value)
...             return cls
...     return decorator
... 
>>> def update_x(base_values, my_value):
...    return sum(base_values + [my_value], tuple())
... 
>>> class Foo: x = (1,)
... 
>>> @inherit_attribute('x', update_x)
... class Bar(Foo): x = (2,)
... 
>>> Bar.x
(1, 2)

可以尝试下

update_x([(1,)], (2,))

用户回答回答于

my_list手动访问命名空间:

class Meta(type):
    def __prepare__(name, bases, **kwds):
        print("preparing {}".format(name), kwds)
        my_list = []
        for b in bases:
            if hasattr(b, 'my_list'):
                my_list.extend(b.my_list)
        return {'my_list': my_list}

class A(metaclass=Meta):
    my_list = ["a"]

class B(A):
    my_list.append(2)

print(A().my_list)
print(B().my_list)

扫码关注云+社区