【发布时间】:2018-04-21 07:02:21
【问题描述】:
我试图让父类中描述的属性/设置器方法在继承到子类时工作。当我直接从父类分配调用时,我可以让它工作,如下所示。但就我而言,我需要将相同的调用包装在一个方法中,以便在调用父类之前进行一些计算。我可以通过使用 fget 方法并将对象传递给它来使其工作,但我希望前一种方法工作。
我在 StackOverflow 上查找了该问题,发现提到的一些方法涉及使用 super(),我尝试过,但没有成功。
感谢任何帮助让这个继承的属性方法在子类中工作!
class A(object):
""" Base Class """
def __init__(self, n):
self.n = n
@staticmethod
def slices():
def get_slices(self):
return self.n
def set_slices(self, n):
self.n = n
return property(get_slices, set_slices)
class B(A):
def __init__(self, n):
self.n = n
his_slices = A.slices() # <--- works well
def her_slices(self): # <--- does not work
return A.slices()
if __name__ == "__main__":
b = B(100)
# This works
print("%d slices" % b.his_slices)
# 100 slices
# This fails
print("%d slices" % b.her_slices)
# TypeError: %d format: a number is required, not method
# Can be made to work like this, but I want above to work
ss = b.her_slices()
print("%d slices" % ss.fget(b))
# 100 slices
【问题讨论】:
-
A.slices下的缩进是否正确(我的意思是就像在您的代码中一样,粘贴在这里时没有更改)?如果是,那就错了。那么是定义2个实例的静态方法吗? (基于 arg 名称)方法。 -
感谢您的快速回复!是的,这是正确的。这是一种定义属性/设置器函数的显式方式。从 his_slices 方法调用中可以看出,对该静态方法的调用有效。
-
你的问题不清楚,至少对我来说是这样。父 A 没有属性,所以子 B 不能继承它。只有
slices静态方法在每次调用时创建并返回一个描述符 - 实现一个属性。这没有什么意义(对我来说),因为描述符必须是类的成员才能在所有实例中都具有工作属性。但是,您的代码中并非如此。如果你不使用属性访问的内置规则,你需要自己调用 getter,创建一个代码以复杂的方式做一些琐碎的事情。 -
您完全正确,但我正在开发一个开源项目,并且我正在尝试编写一个继承父类的子类,正如我在示例中所描述的那样。无论好坏,这就是父类的编写方式。我发现事情正因此变得令人费解。
标签: python inheritance subclass