2017-08-03 66 views
-2

我正在学习python食谱。 我试图执行下面的代码,这是从蟒食谱第8章。 此代码是有关类在Python中制作类的属性

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(预期是一个字符串)。 但我没有。 我的代码的哪些部分应该更改?

+1

我投票细节关闭这个问题作为题外话b因为SO不是SolveMyExerciseForMe.com –

回答

2

我想你忘记了一些作品,特别是:

  1. @property第一def first_name(self):

  2. @first_name.setter上述def first_name(self, value):

  3. @first_name.deleter第二def first_name(self):

上方上面
+0

谢谢!我解决了它 –

0

下面的代码会给你你所期望的错误。

两个主要问题:

  1. 你在你的__init__self.first_name = first_name。这最终会覆盖功能first_name。你的意思是self._first_name = ...
  2. 您定义了相同的功能三次(first_name)。 Python没有函数重载,所以你不能这样做。我相信最后的定义会获胜。下面我评论了我认为你实际上不打算打电话的两个功能。
  3. 你有一个缩进错误......你最后两行可能根本没有被执行,因为它们在你的类定义中。

“工作”代码:

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) 

编辑

至于其他的答案指出,根据你的问题的情况下,你可能要做出first_name实际属性通过@property装修。这可能是使代码正常工作的更好方法,但希望这可以帮助您了解现有代码中发生的情况。

0

你缺少装饰功能与@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 

财产exapmle

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 

property in python

+0

谢谢!我解决它! –

+0

@junghyemin wlcm – Kallz