【问题标题】:why can you inherit private functions from class object in python为什么你可以从python中的类对象继承私有函数
【发布时间】:2021-01-02 23:09:30
【问题描述】:
class Cat:
    a=4

cat = Cat()
cat.__str__()

Cat类怎么会继承object的私有函数__str__()__format__()

私有函数的重点不是不能继承吗?

【问题讨论】:

  • dunders(双下划线) 不是私有函数,python 也没有真正的私有函数。
  • 最后的双下划线也会改变(读作:remove)名称 mangling。
  • dunder = __foo__

标签: python python-3.x


【解决方案1】:

类 Cat 怎么会继承对象的私有函数 __str__()__format__()

首先,这些方法实际上并不是私有的。有点令人困惑的是,python 将 __varname 用于私有变量/方法,而 __varname__ 不是私有的,可以被视为魔术方法或 dunders,通常用于运算符重载。

私有函数的重点不是不能继承吗?

不完全是。 __varname 私有变量具有不可继承的感觉:

class Foo:
    def __foo(self):
        print("foo")

    def __init__(self):
        self.__foo() # prints foo

class Bar(Foo):
    def __init__(self):
        super().__init__() # will print foo
        self.__foo() # will error saying no __foo method

但是,这仅仅是由于 python 的double underscore name mangling。类Foo 中的__foo 变为_Foo__foo,并且它 继承到Bar,但它保留其Foo 前缀。因此,当您尝试从Bar 调用__foo 时,它将被分解为不存在的_Bar__foo。如果您将Bar 中的self.__foo() 行替换为self._Foo__foo(),则不会出现错误,并且您将调用“私有”属性。

另见:

【讨论】:

    【解决方案2】:

    python 中没有 publicprivate 的东西。一切都可以从任何地方访问。

    但是有一些命名约定表明用户是否应该使用或访问成员。见python.org section

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-30
      • 2019-08-27
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多