Property()如何知道要做什么?

2024-09-24 22:20:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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.")

Tags: tonameselfnewdefpropertychangetalk
1条回答
网友
1楼 · 发布于 2024-09-24 22:20:35

property的第三个参数应该是一个删除属性的函数,而不是另一个setter函数(函数名没有特殊意义,只是命名它set_something并不能使它成为setter)。official documentation of property很好地解释了fgetfsetfdel应该做什么。你知道吗

要了解内部如何工作,您可以阅读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

相关问题 更多 >