在python中生成类的属性

在python中生成类的属性,python,Python,我正在学习python食谱。 我正在尝试执行python手册第8章中的以下代码。 这段代码是关于类的属性的 class Person: def __init__(self, first_name): self.first_name=first_name #getter function #property def first_name(self): return self._first_name #settier f

我正在学习python食谱。 我正在尝试执行python手册第8章中的以下代码。 这段代码是关于类的属性的

class Person:
    def __init__(self, first_name):
        self.first_name=first_name  

    #getter function
    #property
    def first_name(self):
        return self._first_name

    #settier function
    def first_name(self, value):  
        print(value, isinstance (value,str))
        if not isinstance(value, str):
            raise TypeError("expected a string")
        self._first_name=value

    #deleter function
    def first_name(self):
        raise AttributeError("can not delete attribute")

    c=Person('PETTER')
    c.first_name(42)
创建类之后,我创建了实例,故意输入了错误的值

我以为我得到了TypeError(应该是字符串)。 但我没有。
我的代码的哪一部分应该更改?

我想你忘记了一些内容,特别是:

  • 第一个
    def first\u name(self)上方的
    @property

  • @first\u name.setter
    以上
    def first\u name(self,value):

  • @first\u name.deleter
    位于第二个
    定义first\u name(self):


  • 下面的代码将给出您预期的错误

    两个主要问题:

  • 您在
    \uuuu init\uuuu
    中有
    self.first\u name=first\u name
    。这最终会覆盖函数
    first\u name
    。你的意思是
    self.\u first\u name=…
  • 您定义了三次相同的函数(
    first\u name
    )。Python没有函数重载,所以您不能这样做。我相信最后一个定义会赢。下面我注释掉了两个函数,我认为您实际上并不打算调用它们
  • 你有一个缩进错误。。。最后两行可能根本没有执行,因为它们在类定义中
  • “工作”代码:

    编辑


    正如其他答案所指出的,根据问题的上下文,您可能将通过
    @property
    装饰器将
    名字
    变成实际的属性。这可能是使代码正常工作的更好方法,但希望这能帮助您了解现有代码中发生的情况。

    您缺少@property@setter的装饰功能

    class Person:
        def __init__(self, first_name):
            self.first_name=first_name  
    
    
        @property
        def first_name(self):
            return self._first_name
    
        @first_name.setter 
        def first_name(self, value):  
            print(value, isinstance (value,str))
            if not isinstance(value, str):
                raise TypeError("expected a string")
            self._first_name=value
    
    属性示例

    class Temp:
    
        def __init__(self,x):
            self.x = x
    
        @property
        def x(self):
            return self.__x
    
        @x.setter
        def x(self, x):
            self.__x = x
    

    有关

    的详细信息,我投票将这个问题作为离题题结束,因为这不是我的答案。com@junghyeminwlcm
    class Temp:
    
        def __init__(self,x):
            self.x = x
    
        @property
        def x(self):
            return self.__x
    
        @x.setter
        def x(self, x):
            self.__x = x