【问题标题】:Python: Using derived class attributes in base classPython:在基类中使用派生类属性
【发布时间】: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_attribA 的方法中的含义。
  • C++ 使用严格的内存布局,python 使用字典。
  • 感谢您的快速回复。使用这种模式是可以/合法的还是被认为是滥用?
  • @mittal 父类对其子类做出这样的假设并不是一个好主意。如果printFreak 方法是定义.derived_attrib 的子类的属性会更好。在 Python 中,将属性动态添加到类实例中是很常见的,但是对于不属于类定义(在类本身中或在其中之一中定义)的属性做出假设的方法仍然有点臭。它的父母)。
  • @khelwood 您介意发表您的评论作为答案吗?我认为这可以从“未答复”列表中删除。

标签: python inheritance


【解决方案1】:

在 Python 中,属性是在运行时解析的,因此它只是在 self 所引用的对象中查找名为 derived_attrib 的属性,并发现有一个。

只要将derived_attrib 声明为A 的字段,然后在B 中赋值,它就可以在C++ 中工作,因为这样编译器就能够找出self.derived_attribA 中的含义。 s 方法。

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多