2014-03-06 47 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