【问题标题】:Can a child instance access dynamic parent instance attributes and attribute values?子实例能否访问动态父实例属性和属性值?
【发布时间】:2013-08-22 21:28:02
【问题描述】:

所以我有一个父子类:

class Map(object):
    def __init__(self, name=''):
        self.mapName = name
        self.rules = {}

class Rule(Map):
    def __init__(self, number):
        Map.__init__(self)
        self.number = number

    def __repr__(self):
        return "Map " + self.mapName + " rule number " + str(self.number)

if __name__ == "__main__":
  map = Map("thismap")
  rule = Rule(1)
  map.rules[rule.number] = rule

以上内容:

$ python -i inherit.py
>>> map
<__main__.Map object at 0xb7e889ec>
>>> map.rules
{1: Map  rule number 1}
>>> map.rules[1]
Map  rule number 1
>>>

我已经尝试添加:

  map.rules[2] = Rule(2)

但还是这样:

$ python -i inherit.py
>>> map.rules
{1: Map  rule number 1, 2: Map  rule number 2}
>>>

和:

 map.rule = Rule(3)

这也没有真正让我得到我正在寻找的东西:

>>> map.rules
{1: Map  rule number 1, 2: Map  rule number 2}
>>> map.rule
Map  rule number 3
>>>

我想要做的是将子实例链接到父类的实例并访问动态父类属性和值,在这种情况下会很方便,因为我想用列表填充地图规则并打印规则,包括每个规则的父映射名称。我只是不确定如何在 python 中执行此操作。或者我只是想以一种不应该使用的方式使用继承,或者遗漏了一些明显的悲剧。

欢迎提出任何想法,提前致谢

【问题讨论】:

  • self.mapName 不是你的子类的构造函数设置的,所以它有默认值,即空字符串。

标签: python class inheritance


【解决方案1】:

你在滥用继承。 Rule 不需要从 Map 继承来访问 Map 的属性,并且将 Rule 附加到 Map 不会使其将 Map 的属性值视为自己的。从地图继承意味着规则地图,而不是它链接到地图或由地图管理。

如果你想让一个规则知道它的地图,让它记录它与哪个地图相关联:

class Rule(object):
    def __init__(self, number, map):
        super(Rule, self).__init__()
        self.number = number
        self.map = map
    def __str__(self):
        # __str__, not __repr__, because __repr__ should be unambiguous,
        # have a clear beginning and ending, and obviously indicate the type.
        return "Map {} rule number {}".format(self.map.mapName, self.number)

Rule(1, map)  # makes a rule associated with map

您可能希望折叠生成规则并将其添加到地图中的一个操作 - 可能是Map 的实例方法。

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多