python - 为什么我可以在 Python 的抽象类中访问派生类的变量?

标签 python

我很惊讶下面的代码运行没有错误。

# 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)。这意味着您自己访问这些通常不是一个好主意。但是没有适当的机制来阻止您访问它们:变量名或多或少要求您不要访问它。如果您绝对需要它,这是您的责任。

现在 aBarBar成员类,不属于Bar实例。所以在其他一些语言中,它会被认为是static。这是您可以访问它的另一个原因。

关于python - 为什么我可以在 Python 的抽象类中访问派生类的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44577145/

相关文章:

python - 将字符串拆分为整数

python - 如何从多个子进程公开普罗米修斯指标?

python - 如何永远运行脚本?

python - 协调 basemap 箭袋和 matplotlib 箭头

python - 将矩阵(列表列表)转换为python中的方阵

python - getaddrinfo 无法解析主机

python - 使用 GEKKO 时无法访问服务器。到底是怎么回事?

python - Visual Studio Tools for AI - 未加载变量资源管理器

python - 拉普拉斯平滑到 Biopython

python - “函数”对象在 Django 1.7 中没有属性 'META'?