为了账号安全,请及时绑定邮箱和手机立即绑定

加入装饰器后可能的名称冲突问题

class Student(Person):

    def __init__(self, name, score):
        self.name = name
        self.score = score
        
    @property
    def score(self):
        print 'using decorator'
        return self.score
        
    @score_setter
    def score(self, score):
         = score

如果像这样写的话,会不会产生名称冲突的问题。

比如:

s = Student('Alice',90)
s.score = 86

外面的s.score实际上是set_score函数,执行该函数时,我标注为黑色的self.score究竟是指哪个?

是带装饰器的那个get_score函数,还是在__init__里出现的self.score属性?

正在回答

1 回答

第一个score(self)是get方法,用@property装饰,第二个score(self, score)是set方法,用@score.setter装饰,@score.setter是前一个@property装饰后的副产品。我的理解是“装饰器”将get_score()装饰成了属性使用,每使用一次score这个属性就相当于调用了get_score(),这个函数的返回值就是self.score


我做了一个尝试,去掉@property装饰器下main的定义,报出如下错误

File "index.py", line 11, in Student

    @score.setter

NameError: name 'score' is not defined

score.setter里面的score应该是指该类实例中的socre属性。我们在有@property时

///以上发现解释不清!不删!为什么!我皮了好久的!


我有一个想法

我们在@property下get_score不返回self.score,我们返回self.score()+20


class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
        
    @property
    def score(self):
        print 'using decorator'
        return self.score+20
        
    @score.setter
    def score(self, score):
        self.score= score
p=Student('liqingshang','60')
p.score=79
print p.score

给出了一个

RuntimeError: maximum recursion depth exceeded

超出了最大递归深度,之所以会产生递归只有一种可能,就是p.score调用的是p.get_score(),是指向了这个方法。由此我们可以知道!计算机并没有给出冲突,他选择了先调用get_score方法,score和get_score也必须是一样的,如果不一样就是尝试递归进入死循环。但是这两个并不完全等价,一个在堆里面,一个在方法区。只是我不知道怎样先访问属性变量,这个指针由谁保管。

我刚接触python,知道的并不多!这是浅陋见解,如果你有更好的理解,请一定告知我!

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

加入装饰器后可能的名称冲突问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信