>> class person: age = None name = None 然后-6ren">
gpt4 book ai didi

python - 在对象定义中使用 "()"和不使用它有什么区别?

转载 作者:行者123 更新时间:2023-11-30 23:07:53 24 4
gpt4 key购买 nike

如下所示,我定义了一个名为 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'
>>>

最佳答案

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'

关于python - 在对象定义中使用 "()"和不使用它有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32022055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com