所以我正在学习课程。为什么我不能使用第三个代码块来执行与第二个代码块明显相同的操作?为什么我必须将p1
分配给person()
,而不是像我在第三个代码块中那样使用person()
?
#class
class person:
def asdf(self):
self.firstname=""
self.lastname=""
self.id=""
self.email=""
self.friends=[]
#second block of code
p1 = person()
p1.firstname="Dave"
p1.lastname="Johnson"
p1.id="2345239"
p1.email="dave@gmail.com"
print p1.firstname
#third block of code
person().firstname="Dave"
person().lastname="Johnson"
person().id="2345239"
person().email="dave@gmail.com"
print person().firstname
答案 0 :(得分:5)
在第二个块中,您可以更改同一实例的属性。
p1 = person() # create new instance
p1.firstname="Dave" # change its first name
p1.lastname="Johnson" # change its last name
# ...
print p1.firstname # access its firstname
在第三个块中,您在每一行中创建一个新实例。
person().firstname="Dave" # create new instance and change its firstname
person().lastname="Johnson" # create new instance and change its lastname
# ...
print person().firstname # create new instance and access its firstname
为了更准确,问题只发生在最后一行,因为您尝试访问尚未声明的attirbute,因为firstname
属性仅在函数asdf
中声明,或者,在第二个块中,在行p1.firstname="Dave"
这是一个简单的例子:
>>> class A:
... def AA(self):
... self.a = 1
...
>>> a = A()
>>> a.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute 'a'
>>> a.a = 1
>>> a.a
1
答案 1 :(得分:3)
在第三个代码块中,每次调用person()
都会创建person
类的新实例。然后代码在该对象上设置属性的值,然后丢弃整个对象,因为它不存储在任何变量中。
答案 2 :(得分:1)
仅供参考,python样式是在类上使用camel case。这是问题的一部分。初始上限有助于区分类构造和方法调用。
定义一个班级:
class Person(object):
def asdf(self):
self.firstname=""
self.lastname=""
self.id=""
self.email=""
self.friends=[]
制作一个实例:
p = Person()
像函数调用一样使用类名构造一个实例,使用该类作为原型。在第二个块中,您已经创建了一个实例,并且您正在更改其属性。
在第三个块中,您创建了四个新的person实例,在它们上面设置了一个属性,并将它们抛弃(因为它们没有分配给任何东西)。
对类的写法非常值得一读: http://docs.python.org/tutorial/classes.html
您需要大量的底层实现,但也有一些关于类,实例和属性的重要细节。