【发布时间】:2016-12-25 04:57:06
【问题描述】:
当我遇到这个特定代码时,我正在阅读一些代码,其中基类方法正在打印一些来自派生类的属性,调用该方法的对象来自派生类。
class A(object):
def printFreak(self):
print self.derived_attrib
class B(A):
def __init__(self, num):
self.derived_attrib = num
my_obj = B(10)
my_obj.printFreak()
由于我以前没有见过这样的行为(比如在 C++ 中),我无法理解这一点。
谁能帮我理解这个,它是如何工作的?这可能与C++的一些概念有关吗?
【问题讨论】:
-
在Python中,属性是在运行时解析的,所以它只是在
self所引用的对象中寻找一个名为derived_attrib的属性,然后发现有一个。只要将derived_attrib声明为A的字段,然后在B中赋值,它就可以在C++ 中工作,因为这样编译器就能够找出self.derived_attrib在A的方法中的含义。 -
C++ 使用严格的内存布局,python 使用字典。
-
感谢您的快速回复。使用这种模式是可以/合法的还是被认为是滥用?
-
@mittal 父类对其子类做出这样的假设并不是一个好主意。如果
printFreak方法是定义.derived_attrib的子类的属性会更好。在 Python 中,将属性动态添加到类实例中是很常见的,但是对于不属于类定义(在类本身中或在其中之一中定义)的属性做出假设的方法仍然有点臭。它的父母)。 -
@khelwood 您介意发表您的评论作为答案吗?我认为这可以从“未答复”列表中删除。
标签: python inheritance