【问题标题】:How does Property() know what to do? [closed]Property() 如何知道该做什么? [关闭]
【发布时间】:2014-04-09 11:52:29
【问题描述】:

我是 Python 新手,刚刚接触到编程教科书中的 OOP 章节。

教科书没有解释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.")

【问题讨论】:

标签: python python-2.7 properties


【解决方案1】:

property 的第三个参数应该是一个删除该属性的函数,而不是另一个 setter 函数(函数名没有特殊含义,只是命名为 set_something 不不要让它成为二传手)。 official documentation of property 很好地解释了 fgetfsetfdel 的预期用途。

要了解property 如何在内部工作,您可以阅读 Ashwini Chaudhary 所指出的 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

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 2014-02-16
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 2022-01-01
    相关资源
    最近更新 更多