python-3.x - 解析派生类中的私有属性
问题描述
假设我有一个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
,所以__perimeter
inCircle
会解析为_Circle.__perimeter
。
因此,如果我运行以下代码,流程将是什么:
t = Tire(20)
print(t.area())
我相信t.area()
会调用self.__perimeter()
which would besolved to Tire._Tire__perimeter
,但这不符合我得到的答案。
所以基本上归结为,如何self
解决?
有人可以解释一下这背后的流程吗?
PS:这个疑问是基于 Raymond Hettinger 的演示视频。
解决方案
调用时不会调用类__perimeter
中的方法,而是调用类中的方法。通过这个,你不要打电话(当心自我- 它有轮胎类型,因此调用轮胎周长方法)Tire
t.area()
perimeter
Circle
self.__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
推荐阅读
- python - 将多个训练数据 npy 文件附加到一个 npy 文件
- jquery - 如何在 jQuery Datables.net 中捕获箭头键
- imap - imap 是否支持多个连接?
- c# - 将此消息发送到您的机器人时出错:HTTP 状态代码已禁止。Azure 门户
- c# - Restsharp AddJsonBody 的最佳使用方式是什么?对象或正文字符串?
- java - 如何知道两个类是否实现了一个公共接口?
- excel - 是否有一个 Excel 公式可以以固定的行间隔填充具有特定数字的单元格?
- android - 构建apk时如何打破文件数[64K]限制?
- node.js - 如何在路由中传递模式模型
- solr - SOLR 同义词不适用于某些关键字