在Python中创建等效类?

时间:2010-01-04 13:30:44

标签: python

我在Python中重载或屏蔽了类。以下代码示例是否创建了等效的类?

class CustASample(object):
    def __init__(self):
        self.__class__.__name__ = "Sample"

    def doSomething(self):
        dummy = 1

class Sample(object):
    def doSomething(self):
        dummy = 1

编辑:从gs的评论和好的答案中,我发现,我真的想问:什么“属性”使这些类不同?

由于

>>> dir(a) == dir(b)
True

>>> print Sample
<class '__main__.Sample'>
>>> print CustASample
<class '__main__.Sample'>

>>> Sample == CustASample
False

2 个答案:

答案 0 :(得分:10)

不,他们仍然不同。

a = CustASample()
b = Sample()
a.__class__ is b.__class__
-> False

以下是你如何做到的:

class A(object):
    def __init__(self):
        self.__class__ = B

class B(object):
    def bark(self):
       print "Wuff!"

a = A()
b = B()
a.__class__ is b.__class__
-> True

a.bark()
-> Wuff!

b.bark()
-> Wuff!

通常你会用__new__方法代替__init__

class C(object):
    def __new__(cls):
        return A()

要回答您更新的问题:

>>> a = object()
>>> b = object()
>>> a == b
False

为什么 a 不等于 b ,因为两者都只是没有属性的普通对象?

嗯,答案很简单。 ==运算符调用__eq__(如果可用)。但除非你自己定义,否则不是。而不是a is b被使用。

is比较对象的ID。 (在CPython中的内存地址。)你可以得到像这样的对象的id:

>>> id(a)
156808

答案 1 :(得分:0)

类,不仅是实例,也是对象。例如,您可以获取id(Sample)。尝试并看到这两个数字不同,因为类的内存位置不同。它们不是同一个对象。这就像问[] is []

编辑:太晚了,gs的解释更好。