我这样做:
def set_property(property,value):
def get_property(property):
or
object.property = value
value = object.property
python使用getter和setter的方法是什么?
我这样做:
def set_property(property,value):
def get_property(property):
or
object.property = value
value = object.property
python使用getter和setter的方法是什么?
当前回答
您可以使用访问器/突变器(即@attr。Setter和@property)或不是,但最重要的是保持一致!
如果你只是使用@property来访问一个属性,例如:
class myClass:
def __init__(a):
self._a = a
@property
def a(self):
return self._a
使用它来访问每个*属性!使用@property访问某些属性,而将其他一些属性保留为公共(即名称不带下划线)而没有访问器,这将是一个糟糕的做法,例如do not do
class myClass:
def __init__(a, b):
self.a = a
self.b = b
@property
def a(self):
return self.a
注意那个自我。B在这里没有显式访问器,尽管它是公共的。
与setter(或mutators)类似,可以随意使用@attribute。Setter,但要一致!当你做的时候。
class myClass:
def __init__(a, b):
self.a = a
self.b = b
@a.setter
def a(self, value):
return self.a = value
It's hard for me to guess your intention. On one hand you're saying that both a and b are public (no leading underscore in their names) so I should theoretically be allowed to access/mutate (get/set) both. But then you specify an explicit mutator only for a, which tells me that maybe I should not be able to set b. Since you've provided an explicit mutator I am not sure if the lack of explicit accessor (@property) means I should not be able to access either of those variables or you were simply being frugal in using @property.
*例外情况是,当你显式地想要使某些变量可访问或可变,但不是两者,或者你想在访问或改变一个属性时执行一些额外的逻辑。这是我个人使用@property和@attribute的时候。Setter(否则没有显式的公共属性访问器/变异器)。
最后,PEP8和谷歌风格指南建议:
PEP8,为传承而设计说:
对于简单的公共数据属性,最好只公开属性名,而不需要复杂的访问器/突变器方法。请记住,如果您发现一个简单的数据属性需要增长函数行为,Python为将来的增强提供了一个简单的途径。在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面。
另一方面,根据谷歌风格指南Python语言规则/属性,建议如下:
在新代码中使用属性来访问或设置数据,而通常使用简单、轻量级的访问器或setter方法。属性应该使用@property装饰器创建。
这种方法的优点:
通过消除用于简单属性访问的显式get和set方法调用,提高了可读性。允许延迟计算。考虑了维护类接口的python方式。就性能而言,当直接变量访问是合理的时,允许属性绕过了需要简单的访问器方法。这也允许将来在不破坏接口的情况下添加访问器方法。
优缺点:
必须从Python 2中的对象继承。可以隐藏像操作符重载这样的副作用。子类可能会让人困惑。
其他回答
In [1]: class test(object):
def __init__(self):
self.pants = 'pants'
@property
def p(self):
return self.pants
@p.setter
def p(self, value):
self.pants = value * 2
....:
In [2]: t = test()
In [3]: t.p
Out[3]: 'pants'
In [4]: t.p = 10
In [5]: t.p
Out[5]: 20
试试这个:Python属性
示例代码如下:
class C(object):
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
print("getter of x called")
return self._x
@x.setter
def x(self, value):
print("setter of x called")
self._x = value
@x.deleter
def x(self):
print("deleter of x called")
del self._x
c = C()
c.x = 'foo' # setter called
foo = c.x # getter called
del c.x # deleter called
使用@property和@attribute。Setter不仅可以帮助您使用“pythonic”方式,还可以在创建对象和更改对象时检查属性的有效性。
class Person(object):
def __init__(self, p_name=None):
self.name = p_name
@property
def name(self):
return self._name
@name.setter
def name(self, new_name):
if type(new_name) == str: #type checking for name property
self._name = new_name
else:
raise Exception("Invalid value for name")
通过这种方式,您实际上可以向客户端开发人员“隐藏”_name属性,并对name属性类型进行检查。请注意,即使在初始化过程中也会调用setter。所以:
p = Person(12)
会导致:
Exception: Invalid value for name
But:
>>>p = person('Mike')
>>>print(p.name)
Mike
>>>p.name = 'George'
>>>print(p.name)
George
>>>p.name = 2.3 # Causes an exception
您可以使用访问器/突变器(即@attr。Setter和@property)或不是,但最重要的是保持一致!
如果你只是使用@property来访问一个属性,例如:
class myClass:
def __init__(a):
self._a = a
@property
def a(self):
return self._a
使用它来访问每个*属性!使用@property访问某些属性,而将其他一些属性保留为公共(即名称不带下划线)而没有访问器,这将是一个糟糕的做法,例如do not do
class myClass:
def __init__(a, b):
self.a = a
self.b = b
@property
def a(self):
return self.a
注意那个自我。B在这里没有显式访问器,尽管它是公共的。
与setter(或mutators)类似,可以随意使用@attribute。Setter,但要一致!当你做的时候。
class myClass:
def __init__(a, b):
self.a = a
self.b = b
@a.setter
def a(self, value):
return self.a = value
It's hard for me to guess your intention. On one hand you're saying that both a and b are public (no leading underscore in their names) so I should theoretically be allowed to access/mutate (get/set) both. But then you specify an explicit mutator only for a, which tells me that maybe I should not be able to set b. Since you've provided an explicit mutator I am not sure if the lack of explicit accessor (@property) means I should not be able to access either of those variables or you were simply being frugal in using @property.
*例外情况是,当你显式地想要使某些变量可访问或可变,但不是两者,或者你想在访问或改变一个属性时执行一些额外的逻辑。这是我个人使用@property和@attribute的时候。Setter(否则没有显式的公共属性访问器/变异器)。
最后,PEP8和谷歌风格指南建议:
PEP8,为传承而设计说:
对于简单的公共数据属性,最好只公开属性名,而不需要复杂的访问器/突变器方法。请记住,如果您发现一个简单的数据属性需要增长函数行为,Python为将来的增强提供了一个简单的途径。在这种情况下,使用属性将函数实现隐藏在简单的数据属性访问语法后面。
另一方面,根据谷歌风格指南Python语言规则/属性,建议如下:
在新代码中使用属性来访问或设置数据,而通常使用简单、轻量级的访问器或setter方法。属性应该使用@property装饰器创建。
这种方法的优点:
通过消除用于简单属性访问的显式get和set方法调用,提高了可读性。允许延迟计算。考虑了维护类接口的python方式。就性能而言,当直接变量访问是合理的时,允许属性绕过了需要简单的访问器方法。这也允许将来在不破坏接口的情况下添加访问器方法。
优缺点:
必须从Python 2中的对象继承。可以隐藏像操作符重载这样的副作用。子类可能会让人困惑。
你可以使用神奇的方法__getattribute__和__setattr__。
class MyClass:
def __init__(self, attrvalue):
self.myattr = attrvalue
def __getattribute__(self, attr):
if attr == "myattr":
#Getter for myattr
def __setattr__(self, attr):
if attr == "myattr":
#Setter for myattr
注意__getattr__和__getattribute__是不同的。__getattr__只在未找到属性时调用。