在对象定义中使用“()”和不使用它有什么区别?

2024-10-05 10:06:36 发布

您现在位置:Python中文网/ 问答频道 /正文

如下所示,我定义了一个名为Person的类,其中有两个成员名为agename

>>> class person:
    age = None
    name = None

然后我定义这个类的两个对象如下:

>>> p1 = person
>>> p2 = person()

我的问题是p1p2之间的区别是什么:

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

Tags: 对象namenoneage定义main成员at
1条回答
网友
1楼 · 发布于 2024-10-05 10:06:36

Person是一个类。表达式Person()创建该类的实例。所以p1p2之间的区别是p1是对类的引用,p2是对该类的实例的引用。例如,可以使用p1实例化其他Person对象:

>>> p3 = p1()
>>> p3
<__main__.person instance at 0x10c9403f8>

如果person有实例变量,您可能会发现一个差异。在您的例子中,nameage是类变量。这意味着它们被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

这里,nameage实例变量。你知道吗

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

相关问题 更多 >

    热门问题