如下所示,我定义了一个名为Person
的类,其中包含两个名为age
和name
的成员:
>>> class person:
age = None
name = None
然后我定义了这个类的两个对象,如下所示:
>>> p1 = person
>>> p2 = person()
我的问题是p1
和p2
之间有什么区别:
>>> p1
<class __main__.person at 0x0328FF80>
>>> p2
<__main__.person instance at 0x03273738>
>>>
他们的行为是平等的:
>>> p1.age = 19
>>> p1.name = "Steve"
>>> p2.age = 20
>>> p2.name = "Jimme"
>>> p1.age
19
>>> p1.name
'Steve'
>>> p2.age
20
>>> p2.name
'Jimme'
>>>
答案 0 :(得分:3)
Person
是一个班级。表达式Person()
创建该类的实例。因此,p1
和p2
之间的区别在于p1
是对类的引用,p2
是对的引用该类的实例。例如,您可以使用p1
来实例化其他Person
个对象:
>>> p3 = p1()
>>> p3
<__main__.person instance at 0x10c9403f8>
如果person
有实例变量,您可能会发现差异。在您的情况下,name
和age
是类变量。这意味着它们由person
类的所有实例共享。这不太可能是你想要的行为。
>>> p1 = person
>>> p2 = person()
>>> p1.name = 'bob'
>>> p1.name
'bob'
>>> p2.name
'bob'
>>> person.name
'bob'
如您所见,现在所有新的person
都称为bob
。
这是一个稍微合理的person
类,仍然可以使用空()
进行实例化:
class Person(object):
def __init__(self, name='bill', age=42):
self.name = name
self.age = age
此处,name
和age
是实例变量。
>>> p1 = Person
>>> p2 = Person()
>>> p3 = Person('fred')
>>> p1.name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'Person' has no attribute 'name'
>>> p2.name
'bill'
>>> p3.name
'fred'