1

请不要笑。生无可恋。

这是一个带有 getter 和 setter 的 Python 类的规范示例(来自Wikipedia):

class Student(object):
    # Initializer
    def __init__(self, name):
        # An instance variable to hold the student's name
        self._name = name

    # Getter method
    @property
    def name(self):
        return self._name

    # Setter method
    @name.setter
    def name(self, new_name):
        self._name = new_name

现在我的版本没有装饰器:

class Student(object):
    # Initializer
    def __init__(self, name):
        # An instance variable to hold the student's name
        self._name = name

    # Getter method
    def name(self):
        return self._name
    name=property(fget=name)

    # Setter method
    def set_name(self, new_name):
        self._name = new_name
    name = property(fset=set_name)

...除了第二个版本不起作用。如果我们实例化 Student 类,例如Bob=Student('Bob')Bob.name 会抛出 AttributeError:unreadable 属性。

我保证,一旦我的声望达到 10k,我将捐赠 100 分给那些在反对票开始涌入之前弯腰指出错误的好心人。

4

2 回答 2

5

您还需要命名吸气剂:

name = property(fget=name, fset=set_name)

或者干脆

name = property(name, set_name)

请参阅property文档

装饰器@语法只是语法糖;以下形式:

@decorator_expression
def function_name(...):
    ...

执行为:

def function_name(...):
    ...
function_name = decorator_expression(function_name)

请注意该decorator_expression部分如何被视为可调用的,函数作为第一个参数传入。Aproperty()在这方面没有什么不同。

在为 定义第一个属性后,您的类命名空间中name有一个对象,即对象。该对象有一个方法,该方法只返回用传入的新函数替换 setter 的属性。nameproperty.setter()

因此,语法@name.setter导致调用.setter()现有property实例上的方法,并且该方法返回一个属性,其设置器被替换。

因此,您也可以这样拼写您的显式属性创建者:

name = property(name)
name = name.setter(set_name)

您的版本只是将name属性(用 getter 定义)替换为仅定义 setter 的属性,否则两者没有关系。

于 2013-05-07T21:23:44.937 回答
0

getter 和 setter 在 python 中有点毫无意义,除非它们实际上在做事。

class kid:
    def __init__(self,name):
        self.name = name


>>>bill = kid('bill')
>>>bill.name = 'johnny' #is good enough
>>>bill.name
johnny
>>>bill.job = 'student'
>>>bill.job
student
于 2013-05-07T21:24:53.833 回答