我在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
答案 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的解释更好。