我正在开发一个简单的网络服务器,它通过XML处理与浏览器的通信。
为了确保变量的类型是正确的,我通过getter / setter包装了我的类中的(大多数)属性。类似的东西:
class Animal(object):
def __init__(self):
super(Animal, self).__init__()
self.age = None
def setAge(self, age):
try:
self._age = int(age)
except TypeError:
self._age = None
def getAge(self):
return self._age
age = property(getAge, setAge)
服务器还有一个身份验证和权限系统(典型的登录/密码东西......)。
假设已登录的用户没有权限在服务器中设置动物的年龄,但是他正在尝试(有点像huacker,我们已经到了这里,因为javascript应该禁用'age'输入文字,但这是一个不同的问题)...回到这一点!:
现在,当我收到POST时,我会打开其中包含的XML,并检查是否有人试图设置他没有权限的内容。类似的东西:
def receivePOST(request):
xmlTree = Utilities.getXMLTree(request.body)
loggedUser = Utilities.getLoggedUser()
if xmlTree.findtext("age") and not loggedUser.hasPermission("setAge"):
raise Exception("User %s was trying to change the age!!" % loggedUser.userName)
(当然,在“真正的”服务器中有更多的方法,如果... elif ...因为有更多权限可以检查)
我想知道在getter / setter中进行权限检查是否是个好主意(主要是在setter中)。它必须是这样的:
class Animal(object):
def __init__(self):
super(Animal, self).__init__()
self.age = None
def setAge(self, age):
if age is not None:
loggedUser = Utilities.getLoggedUser()
if loggedUser.hasPermission("setAge"):
try:
self._age = int(age)
except TypeError:
self._age = None
else:
raise Exception("User %s was trying to change the age!!" % loggedUser.userName)
else:
self._age = None
一方面,当你真正要做某事时,检查许可似乎是一个非常自然的地方。这也会以更加有效的方式“屏蔽”我服务器中的所有类(如果以某种方式设置“年龄”而不通过'receivePOST'方法会怎样?...没有权限检查那个案子)。另一方面,这意味着我只能在服务器环境中使用我的Animal类(我有'loggedUser')。
另外,我已经读过属性应该(理想情况下)保持简单,这不是一个很好的做法开始加载getters / setters的代码可能会导致很多副作用(有些人说很难代码读取时跟踪错误:myDuck.age = 512)
我不知道......你怎么看?
谢谢!
相关:
When and how to use the builtin function property() in python
Python @property versus method performance - which one to use?