我目前正在尝试抽象/默认一些行为。所有子代以不同的方式定义一些常量,我想在其父类中引用所述变量。我的尝试看起来像这样:
class Mother():
a= True
@staticmethod
def something():
return Mother.a
class Child(Mother):
a = False
print(Mother.something())
print(Child.something())
Mother.something()
显然会产生True
,但是Child.something()
应该会产生False
。
这不起作用,因为我猜想在Python继承中您不会覆盖变量,而只是将它们隐藏在视觉范围之外?
答案 0 :(得分:1)
在Child
类中,当调用something
时,Mother.a
仍然有效,您是指父Mother
类(在{{1}处定义) }的类声明)。对于您的用例,Python还有另一个名为classmethod
的内置函数:
Child
从文档中
类方法不同于C ++或Java静态方法。如果需要这些,请参见staticmethod()。
class Mother():
a = True
@classmethod
def something(cls):
return cls.a
class Child(Mother): # Mother.a gets defined here
a = False
print(Mother.something()) # True
print(Child.something()) # False
定义@classmethod
(按照惯例,该变量不必称为cls
)作为第一个参数,就像实例方法将接收cls
一样作为他们的第一个论点。 self
表示正在调用该方法的类。
我建议this video很好地介绍类的最佳做法,以及如何/在哪里使用python中的所有特殊修饰符/语法。
由于您提到了抽象类,因此您可能也对abc
模块感兴趣。