gpt4 book ai didi

python - python中的双下划线

转载 作者:太空狗 更新时间:2023-10-29 20:22:26 27 4
gpt4 key购买 nike

class A(object):
def __get(self):
pass

def _m(self):
return self.__get()


class B(A):
def _m(self):
return str(self.__get())

print(A()._m())
print(B()._m())

为什么 print(A()._m()) 打印 None,但 print(B()._m()) 引发AttributeError: 'B' 对象没有属性 '_B__get'?

我认为双下划线可以防止方法重写。

如果 __get 是私有(private)的,那么为什么下面的工作有效?

class A(object):
def __get(self):
pass

def _m(self):
return self.__get()


class B(A):
pass

print(A()._m())
print(B()._m())

为什么这段代码不引发 AttributeError 并打印 None 两次?

最佳答案

前导双下划线名称是private(意味着对派生类不可用)

这不是万无一失的。它是通过修改名称来实现的。 Python Documentation说:

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, so it can be used to define class-private instance and class variables, methods, variables stored in globals, and even variables stored in instances. private to this class on instances of other classes.

因此 __get 实际上在 A 类中被分解为 _A__get。当 B 类试图引用 __get 时,它被分解为 _B__get 不匹配。

换句话说,在类 Xyzzy 中定义的 __plugh 意味着“除非你作为类 Xyzzy 运行,否则你不得触摸 __plugh。”

关于python - python中的双下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45288973/

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