让我说我有这样的事情 -
class A(object):
c = C()
class B(A):
pass
class C(object):
def __init__(self):
pass
def get_parent_class(self):
# This should return B
我如何实施get_parent_class
,以便它可以如下工作 -
B.c.get_parent_class() # Returns the class type B (not the instance b!)
这甚至可能吗?
我基本上有一个父类(在我们的示例中为类A
),其中包含一个变量(示例中为var c
)。然后我有一个子类(继承B
)
A
我想使用C
在B
上公开的功能,但为了正确使用,我需要C
知道它在{{1}上运行}
(希望我在最后的解释中没有让事情变得复杂......)
修改
请注意,我没有尝试上B
课程,这很容易C
。我需要持有c.__class__
谢谢!
答案 0 :(得分:1)
AFAIK,你做不到。
B.c只返回对C对象的引用。相同的对象可以是列表的成员,另一个类的实例(比如D)和另一个类的实例(比如E)
只需添加到您的示例中:
class D:
def __init__(self, c):
self.c = c
class E:
c = C()
然后:
>>> c = B.c
>>> E.c = c
>>> d = D(c)
>>> c.a = 1
>>> B.c.a
1
>>> d.c.a
1
>>> E.c.a
1
此时,c对象本身并不知道它属于B,d和E.那c.get_parent_class()
应该返回什么?如何在B和E之间做出决定?
您可以尝试让C知道其容器:
class C(object):
def __init__(self, clazz):
self.clazz = clazz
def get_parent_class(self):
return self.clazz
class A(object):
c = C(A)
您会A.c.get_parent_class()
获得<class '__main__.A'>
,但因为它是同一个对象,B.c.get_parent_class()
也会给<class '__main__.A'>
...
答案 1 :(得分:-1)
您可以查看对象的__bases__
属性。它返回一个对象的基类元组。
您可以在文档here中看到它。
答案 2 :(得分:-1)
您可以从name属性获取该类,例如:
>>> import itertools
>>> x = itertools.count(0)
>>> x.__class__.__name__
'count'
或者这样:
>>> type(x).__name__
'count'