gpt4 book ai didi

python - 如何避免不小心弄乱 Python 中的基类?

转载 作者:行者123 更新时间:2023-11-28 22:35:13 25 4
gpt4 key购买 nike

Python 对私有(private)变量使用下划线约定。但是,似乎没有什么可以阻止您不小心弄乱基类,例如

class Derived(Base):
def __init__(self, ...):
...
super(Derived, self).__init__(...)
...
self._x = ...

如果 Base 也恰好使用名称 _x

避免此类错误的最佳做法是什么?

这似乎特别具有挑战性,如果不同的人实现了 BaseDerived 类,或者 _x 被添加到 BaseDerived 实现之后(因此,Derived 的实现将追溯性地打破封装)

最佳答案

使用private variables with two underscores .这样,名称重整可以保护您不会弄乱您的父类(在正常使用情况下)。

Since there is a valid use-case for class-private members (namely to avoid name clashes of names with names defined by subclasses), there is limited support for such a mechanism, called name mangling. Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.

[...] Note that the mangling rules are designed mostly to avoid accidents; it still is possible to access or modify a variable that is considered private. This can even be useful in special circumstances, such as in the debugger.

示例

class A(object):
def __init__(self):
self.__v = 1
def __str__(self):
return "A = {}".format(self.__v)

class B(A):
def __init__(self):
A.__init__(self)
self.__v = 2
def __str__(self):
return "{}; B = {}".format(A.__str__(self), self.__v)

a = A()
b = B()
print(a)
print(b)

产量

A = 1
A = 1; B = 2

关于python - 如何避免不小心弄乱 Python 中的基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38412261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com