2014-03-06 125 views
-1

我是Python新手,刚刚到达编程教科书中的OOP章节。Property()如何知道该怎么做?

教科书没有说明property()是如何工作的。

property()如何知道将名称更改为new_name而不是new_name + "lololol"

我创建了set_name2,因为我想看看property()是如何工作的。但令我惊讶的是,这个名字并没有改变为new_name + "lololol"

# Property Critter 

class Critter(object): 
    """A virtual pet""" 
    def __init__(self, name): 
     print "A new critter has been born!" 
     self.__name = name 

    def get_name(self): 
     return self.__name 

    def set_name(self, new_name): 
     if new_name == "": 
      print "A critter's name can't be an empty string." 
     else: 
      self.__name = new_name 
      print "Name change successful." 

    def set_name2(self, new_name): 
     self.__name = new_name + "lololol" 
     print "Name change successful (set_name2!)" 

    name = property(get_name, set_name, set_name2) 

    def talk(self): 
     print "\nHi, I'm", self.name 


# main 

crit = Critter("Poochie") 
crit.talk() 
print "\nMy critter's name is:", 
print crit.name 
print "\nAttempting to change my critter's name." 
crit.name = "" 
print "\nAttempting to change my critter's name again." 
crit.name = "Randolph" 

crit.talk() 

raw_input("\n\nPress enter to exit.") 
+2

阅读本则:http://docs.python.org/2/ howto/descriptor.html –

+0

@AshwiniChaudhary我刚刚读过那个网页,但我找不到一个简单的解释。 – BBedit

+0

如果您了解Python类的基础知识,那么这就是IMO的最佳解释。请问一个具体的问题,你需要一个关于属性的教程。 –

回答

2

property的第三个参数有望成为一个功能删除的属性,而不是另一个setter函数(函数的名字没有特别的意义,只是将其命名为set_something并不能使一个二传手)。 official documentation of property对于fget,fsetfdel预计会做什么有很好的解释。

要了解property内部是如何工作,你可以阅读有关descriptors通过阿什维尼乔杜里为指出。

这里是你的代码稍加修改,以说明property行为:

# Property Critter 

class Critter(object): 
    """A virtual pet""" 
    def __init__(self, name): 
     print "A new critter has been born!" 
     self.__name = name 

    def get_name(self): 
     return self.__name 

    def set_name(self, new_name): 
     if new_name == "": 
      print "A critter's name can't be an empty string." 
     else: 
      self.__name = new_name 
      print "Name change successful." 

    def del_name(self): 
     self.__name = "Scratchy" 
     print "If you don't give me a name, I will choose one myself!" 

    name = property(get_name, set_name, del_name) 

    def talk(self): 
     print "\nHi, I'm", self.name 


# main 

crit = Critter("Poochie") 
crit.talk() 
print "\nMy critter's name is:", 
print crit.name 
crit.name = "" 
crit.name = "Itchy" 
crit.talk() 
del crit.name 
crit.talk() 

,输出:

A new critter has been born! 

Hi, I'm Poochie 

My critter's name is: Poochie 
A critter's name can't be an empty string. 
Name change successful. 

Hi, I'm Itchy 
If you don't give me a name, I will choose one myself! 

Hi, I'm Scratchy