我很惊讶下面的代码运行没有错误。
# ABC
class Foo(object):
__metaclass__ = ABCMeta
a = 1
def __init__(self, b, c):
self.b = b
self.c = c
def get_scaled_a(self):
return self.a / Bar1.a # why can I access Bar1.a?
@abstractmethod
def class_type(self):
pass
# Derived class 1
class Bar1(Foo):
a = 100
def class_type(self):
return 'bar1'
# Derived class 2
class Bar2(Foo):
a = 10
def class_type(self):
return 'bar2'
my_bar2_inst = Bar2(0, 0)
print(my_bar2_inst.get_scaled_a())
# 0.1
最佳答案
# Why can I access Bar.a?
因为 Python 假定开发人员是成熟的人。在 Python 中,您通常可以访问所有属性,而不是解释器检查您是否有权访问某个属性。就看你自己够成熟了,不要破坏任何东西。
但是有一个约定,属性以小写字母开头,比如 _foo
, __bar
和 __qux__
被视为私有(private)。这意味着您自己访问这些通常不是一个好主意。但是没有适当的机制来阻止您访问它们:变量名或多或少要求您不要访问它。如果您绝对需要它,这是您的责任。
现在 a
的 Bar
是 Bar
的成员类,不属于Bar
实例。所以在其他一些语言中,它会被认为是“static”。这是您可以访问它的另一个原因。
关于python - 为什么我可以在 Python 的抽象类中访问派生类的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44577145/