我有一个类Klass,类属性为my_list.我有一个子类SubKlass,其中我想有一个类属性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)

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

UPDATE:

Python问题跟踪器上有一个bug:http://bugs.python.org/issue11339.让我们希望它在某个时候会达到solved.

推荐答案

你不能.

类定义在Python中的工作原理如下.

  1. 解释器看到一个class语句,后面跟着一段代码.

  2. 它创建一个新的名称空间,并在名称空间中执行该代码.

  3. 它使用生成的名称空间、类名、基类和元类(如果适用)调用type内置函数.

  4. 它将结果分配给类的名称.

在类定义中运行代码时,您不知道基类是什么,因此无法获取它们的属性.

您要做的是在定义类之后立即修改它.


编辑:这里有一个小类decorator ,可以用来更新属性.这个 idea 是你给它一个名字和一个函数.它查看类的所有基类,并获取它们的属性.然后,它使用从基类继承的值列表和在子类中定义的值调用函数.此调用的结果绑定到名称.

代码可能更有意义:

>>> 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)

我们的 idea 是将x定义为Bar中的(2,).然后,装饰师将查看Bar的子类,找到它们的所有x,并与它们一起调用update_x.所以它会打电话

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

它通过连接它们来组合它们,然后再将其绑定回x.这有意义吗?

Python-3.x相关问答推荐

将strid()映射到Pandas DataFrame中的字符串不会更改NaN条目,但仍然声称它们不同?

文件名中的文件打开和撇号

公开数据中的卫星图像网页抓取优化

如何将函数映射到所有命名元组的元素?

通过 Pandas 通过用户定义函数重命名数据框列

如何提高 snowpark 程序的性能?

合并所有文件并获取特定列数据

Sunburst 折线图可视化

在 string.find() 条件下加入两个 Dataframes

asyncio.as_completed() 应该接受 `Iterable`,但如果输入是 `Generator` 就会崩溃?

如何在两个矩阵的比较中允许任何列的符号差异,Python3?

python2和python3中的列表生成器

通过附加/包含多个列表来创建 nDimensional 列表

如何在数据['column']中的'string'等条件下应用pandas

使用大型多个数据集,其中每个数据集包含多个值 - Pytorch

是否将dict转换为一个数据帧,每个值都有重复的键?

使用 Sublime Text 3 在 Python 3 中打印 UTF-8

无法在 Windows 8 中使用 Python 3.3 找到 vcvarsall.bat

如何为 Python 3.x 安装 psycopg2?

__iter__ 和 __getitem__ 有什么区别?