Mac*_*Mac 1 python setter decorator getter-setter python-3.x
我想知道是否可以有一个属性设置器来返回一个值。下面的代码试图从表面上解释问题。
基本上,我需要为对象设置一个属性,但是在我需要检查它是否唯一之前。我想知道是否有一种方法可以直接将唯一名称返回给用户,而无需在此后查询对象的新名称。
class MyClass(object):
def __init__(self,ID):
self._ID = ID
@property
def Name(self):
return DBGetName(self._ID)
@Name.setter
def Name(self, value):
UniqueName = DBGetUniqueName(self._ID,value)
return DBSetName(UniqueName)
Myinstance = MyClass(SomeNumber)
#What I do now
Myinstance.Name = "NewName"
Uniquename = Myinstance.Name
#What I was wondering if possible. Line below is syntactically invalid, but shows the idea.
Name = (Myinstance.Name = "NewName")
Run Code Online (Sandbox Code Playgroud)
编辑:这是一个伪代码,我忘了实际将值传递给内部函数。我的错。
设置员当然可以返回值。
但是这样做不是很有用,因为在赋值语句中通常使用setter方法(例如您的示例)。
问题是在Python中,赋值不是表达式,而是语句。它没有可以使用的值,也不能将其嵌入另一个语句中。因此,没有办法编写您要编写的行。
您可以改为显式地调用setter…,但是在这种情况下,将其作为常规方法而不是属性setter编写起来要清晰得多。
在您的情况下,我认为常规方法正是您想要的。您完全忽略了传递给设置器的值。这会使您的代码读者(包括6个月内的您)感到困惑。它根本不是一个二传手,它是一个创建唯一名称的函数。那么,为什么不这样称呼呢?
def CreateUniqueName(self):
UniqueName = DBGetUniqueName(self._ID)
return DBSetName(UniqueName)
Run Code Online (Sandbox Code Playgroud)
(值得注意的是,DBSetName返回其参数本身并不是Python风格的…)
如果您想知道Python 为什么以这种方式工作,请参阅为什么不能在表达式中使用赋值?从官方常见问题解答中。
更一般而言,表达式-语句的区别以及诸如的变异方法(例如list.sort)的None替代返回(而不是)的相关特征共同self导致了一种更简单,更规范的语言。当然,这是有代价的,因为这会导致语言的流利性大大降低。有一个明显的权衡,Python尽可能地接近极限。(与JavaScript相比,这是可以达到的另一种极端。)但是,大多数喜欢Python的人都认为它是正确的折衷方案。
| 归档时间: |
|
| 查看次数: |
2185 次 |
| 最近记录: |