首页 > 解决方案 > 解析派生类中的私有属性

问题描述

假设我有一个Circle具有perimeter函数的基类和一个派生类Tire。以下是代码:

import math

class Circle(object):
    
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        p = self.__perimeter()
        return math.pi * (p *0.5/math.pi)**2 

    def perimeter(self):
        return self.__perimeter()
    
    def __perimeter(self):
        return 2.0 * math.pi * self.radius

和轮胎类:

class Tire(Circle):
    def perimeter(self):
        return self.__perimeter()
    def __perimeter(self):
        return Circle.perimeter(self)*1.25

我知道任何带有__in 开头的属性都被解析为_classname.__attribute,所以__perimeterinCircle会解析为_Circle.__perimeter

因此,如果我运行以下代码,流程将是什么:

t = Tire(20)
print(t.area())

我相信t.area()会调用self.__perimeter()which would besolved to Tire._Tire__perimeter,但这不符合我得到的答案。

所以基本上归结为,如何self解决?

有人可以解释一下这背后的流程吗?

PS:这个疑问是基于 Raymond Hettinger 的演示视频。

标签: python-3.x

解决方案


调用时不会调用类__perimeter中的方法,而是调用类中的方法。通过这个,你不要打电话(当心自我- 它有轮胎类型,因此调用轮胎周长方法)Tiret.area()perimeterCircleself.__perimeter()

因此,当您打电话时,t.area()您不要通过t_Tire__perimeter()- 因为这是您在Tire课堂上访问私有外围功能的方式。(~157.079) 代码中的内容基本上是:

t = Tire(20)
print(t.perimeter())

流程是这样的:

  • 创建一个类型的新对象Tire- 它的超类是Circle
  • 打电话t.area()
  • 在面积方法中 -self仍然是Tire(*) 中所示的类型
  • 内部area-self.__perimeter()被称为因此调用_Circle__perimeter

推荐阅读