在Python中用作类级变量时的访问类

时间:2014-01-19 14:54:14

标签: python class class-variables

如果这个问题已在SO上得到解答,或者我的问题可以通过简单的Google搜索解决,我很抱歉,但我不知道描述它的术语,除了问题标题,没有转过来任何结果。

因为我不懂术语,所以我能做的最好就是给出一个我想要的例子。

class MyClassProperty():
    def __init__(self):
        # somehow access MyObject class
        pass

class MyObject():
    var = MyClassProperty()

MyClassProperty不仅需要引用MyObject类,否则会很简单。最终目标是在类级别实例化MyObject时能够自动将方法和变量添加到MyClassProperty类。

我之前看到过框架和库这样做,首先想到的是Kivy及其属性。

感谢您提供的任何帮助,即使该帮助的范围告诉我这是不可能的。

3 个答案:

答案 0 :(得分:1)

明确比隐含更好。处理作曲的惯用方法是使用“mixins”:

class MyFooMixin():
    def foo(self):
        print("I have a foo")

class MyBarMixin():
    def bar(self):
        print("This is a bar, where is my beer?")

class MyObject(MyFooMixin, MyBarMixin):
    pass

>>> x = MyObject()
>>> x.foo()
I have a foo
>>> x.bar()
This is a bar, where is my beer?

也就是说,在某些实现中,您可以检查当前帧。这是一个让你入门的天真的方法(我确定这是错误的,但我不想挖掘所有框架结构的东西,以便编写一个正确的实现):

class Foo(object):
    _instantiators = []
    def __init__(self):
        try:
            raise Exception("foo")
        except Exception as foo:
            for frame in reversed(inspect.stack()):
                try:
                    for line in frame[4]:
                        if line.startswith('class '):
                            class_name = re.match(r'class\s+(\S+?)\(', line).group(1)
                            self._instantiators.append(frame[0].f_globals[class_name])
                            break
                except (IndexError, TypeError):
                    pass

class Bar(object):
    foo = Foo()

if __name__ == '__main__':
    bar = Bar()
    print Foo._instantiators

这个可恶的黑客将打印出来:

[<class '__main__.Bar'>]

这在很多方面可能都是错误的,但Python非常难以理解(我的第二种编程语言是Lisp,在BASIC之后,在Python中我错过了卫生宏和尾部调用优化等lispy功能)。

答案 1 :(得分:1)

看起来您可能需要traits

我在粗略搜索中找到的唯一现有Python实现是:http://code.enthought.com/projects/traits

多重继承也可能对您有用。

class Some(object):
  a = 97
  b = 98
  def f(self):
    return self.a + self.b + self.c

class Other(object):
  c = 99

class Thing(Some, Other, object):
  pass

o = Thing()
p = Thing()
p.a, p.b, p.c = 65, 66, 67

print o.a, o.b, o.c, o.f() # 97 98 99 294
print p.a, p.b, p.c, p.f() # 65 66 67 198    

答案 2 :(得分:0)

我不确定我是否正确,但这是你想要的吗?

class MyObject(object):

    def __init__(self):
        pass

    def my_class_property(self):
        self.property_a = []
        self.property_b = 42

my_object = MyObject()
print my_object.property_a #fails
my_object.my_class_property()
print my_object.property_a
print my_object.property_b