python子类如何调用父类属性_从子类体访问父类属性

你不能

类定义在Python中的工作方式如下。解释器看到一个class语句,后面跟着一段代码。

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

它使用生成的命名空间、类名、基类和元类(如果适用)调用type内置。

它将结果赋给类的名称。

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

您可以在定义类之后立即修改它。

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

代码可能更有意义:>>> 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)

其思想是将x定义为(2,)中的Bar。然后,decorator将遍历Bar的子类,找到它们的所有x,并与它们一起调用update_x。所以它会叫update_x([(1,)], (2,))

它通过连接它们来组合它们,然后再次将其绑定回x。这有道理吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值