如果这个问题已在SO上得到解答,或者我的问题可以通过简单的Google搜索解决,我很抱歉,但我不知道描述它的术语,除了问题标题,没有转过来任何结果。
因为我不懂术语,所以我能做的最好就是给出一个我想要的例子。
class MyClassProperty():
def __init__(self):
# somehow access MyObject class
pass
class MyObject():
var = MyClassProperty()
MyClassProperty
不仅需要引用MyObject
类,否则会很简单。最终目标是在类级别实例化MyObject
时能够自动将方法和变量添加到MyClassProperty
类。
我之前看到过框架和库这样做,首先想到的是Kivy及其属性。
感谢您提供的任何帮助,即使该帮助的范围告诉我这是不可能的。
答案 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