让类成为一个变量

时间:2015-07-31 09:09:25

标签: python inheritance

让我说我有这样的事情 -

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

我想使用CB上公开的功能,但为了正确使用,我需要C知道它在{{1}上运行}

(希望我在最后的解释中没有让事情变得复杂......)

修改 请注意,我没有尝试上B课程,这很容易C。我需要持有c.__class__

的班级

谢谢!

3 个答案:

答案 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'