python 3如何通过在它存在之前引用它来创建类方法属性?

时间:2018-02-28 20:28:36

标签: python python-3.x class-method class-attributes

我正在尝试解决代码问题,我不确定在python中有一个简单的实现。我想通过在它存在之前引用它来动态创建一个类方法属性。听起来很反直觉。当该属性尚不存在且没有从外部设置值时,如何初始化方法内的属性?

class Thing:
   def __init__(self, name):
      self.name = name

   @property
   def is_a(self):
      setattr(self.is_a,"is_a_{}".format(???),True)

john = Thing("John")
john.is_a.man
print(john.is_a_man) # this is directly from the cw test

不先设置它(即john.is_a.man = True),我看不出这是怎么回事。不是使用try / except是一个很好的策略,但我甚至无法弄清楚如何捕获对不存在的属性的引用,所以我可以在处理程序中创建它。任何有关这方面的指导将不胜感激。或者,如果使用Python根本不可能,那就不错了。

https://www.codewars.com/kata/5571d9fc11526780a000011a

1 个答案:

答案 0 :(得分:1)

CodeWars想要的东西是可行的,但是太少的好处和令人困惑的界面太过神奇了,尤其是后面的部分。

class IsA(object):
    def __init__(self, parent):
        self.parent = parent
    def __getattr__(self, name):
        setattr(self.parent, 'is_a_'+name, True)

class Thing(object):
    def __init__(self, name):
        self.name = name
        self.is_a = IsA(self)

thing.is_a访问不需要做任何特别的事情;它是thing.is_a.whatever访问的神奇功能,因此thing.is_a需要使用钩子来评估对象,以便在thing上设置属性。我们将Thing的is_a实现为__getattr__设置其父级的相应属性的对象。