python中的属性方法

ftw*_*ftw 0 python

有人可以解释我这种行为,为什么1)在2)和3)工作时不起作用

1)

class bm(object):
    def __init__(self,val):
        self.a=val
    def get(self):
        return self.a
    def set(self,val):
        self.a=val
        a=property(get,set)


In [43]: ob1=bm('vin')
Run Code Online (Sandbox Code Playgroud)

给我递归错误,而下面的代码工作正常

2)

class bm(object):
    def __init__(self,val):
        self._a=val
    def get(self):
        return self._a
    def set(self,val):
        self._a=val
        a=property(get,set)


In [43]: ob1=bm('vin')
Run Code Online (Sandbox Code Playgroud)

工作正常.我可以访问ob.a并执行ob.a =''

即使这样也可以

3)

class bm(object):
    def __init__(self,val):
        self.a=val
    def get(self):
        return self._a
    def set(self,val):
        self._a=val
        a=property(get,set)

In [43]: ob1=bm('vin')
Run Code Online (Sandbox Code Playgroud)

工作正常.我可以访问ob.a并执行ob.a =''

mip*_*adi 5

在第一个示例中,您正在创建属性a,这使您可以执行以下操作:

self.a               # Get the value
self.a = some_obj    # Set the value
Run Code Online (Sandbox Code Playgroud)

但在a酒店内,您再次提到该a物业,通过!这将产生递归问题.self.a

在下一个示例中,属性a由变量支持,从而self._a避免了此递归问题.