2012-02-13 65 views
0

所以我正在学习类。为什么我不能使用第三块代码来做与第二块代码显然相同的事情?为什么我必须将p1分配给person(),而不是像我在第三块代码中那样使用person()python中的类,变量混淆

#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="[email protected]" 
print p1.firstname 

#third block of code 

person().firstname="Dave" 
person().lastname="Johnson" 
person().id="2345239" 
person().email="[email protected]" 
print person().firstname 
+1

我认为你需要重新阅读你正在学习的任何教程。 – 2012-02-13 20:53:25

回答

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 
+0

因此,在第二个代码块中,p1成为第一行中的新实例,然后在后面的行中进行更改。但在第三部分中,我正在每行创建新实例,并使用名字或姓氏等更改来更改每个单独的实例。我收到的错误消息说'实例没有属性... ...因此,创建p1作为person()的一个实例告诉python它具有这些属性,比如firstname?我不确定一个属性究竟是什么。 – ZCJ 2012-02-13 20:21:28

+0

属性就是你要分配的东西。如果'p1'是一个'person',那么'p1.firstname'就是'person'的'firstname'属性。你不“创建p1作为人的实例()”;你将新创建的'person'类的实例(这是'person()'创建的)赋给变量'p1'。您从第三个块获得错误消息,因为您正在检查的'firstname'的'person'与您分配的'firstname'的'person'不同。当你设置'p1'的'firstname',然后再检查'p1'的'firstname'时,这两个地方显然是同一个'人'。 – 2012-02-13 20:53:00

3

在代码的第三块,每次调用person()创建person℃的新实例姑娘。代码然后设置该对象的属性值,然后丢弃整个对象,因为它不存储在任何变量中。

1

仅供参考,python风格是在类上使用骆驼案例。这是问题的一部分。初始上限有助于区分类构造和方法调用。

定义一个类:

class Person(object): 
    def asdf(self): 
     self.firstname="" 
     self.lastname="" 
     self.id="" 
     self.email="" 
     self.friends=[] 

制作实例:

p = Person() 

使用类名称,如函数调用构造一个实例,使用类作为原型。在第二个块中,您创建了一个实例,并且您正在更改其属性。

在第三个块中,您创建了四个人的新实例,在它们上设置了一个属性,并将它们丢弃(因为它们没有分配给任何东西)。

在类中的书面记录确实是值得一读: http://docs.python.org/tutorial/classes.html

有底层的实现,你并不需要一个公平的,但也有关于类,实例和属性的一些关键细节。

+0

很酷,感谢您的链接。我刚刚开始了这个东西。有关资本化的有趣说明;这似乎不是必要的,但我可以看到自己以后犯的错误不是作为提示什么“人”所指的。 – ZCJ 2012-02-13 20:30:47