可能是我做错了,所以告诉我如何做得更好。 用户说,我正在为某个对象的所有实例实现一个类。 (看起来像M. Fowler的“企业应用程序架构模式”中的模式'表模块')。我附上了我的实现的简化示例。
user
参数可能有不同的类型:
id
我想确定输入变量user
的正确类型并从中获取ID。同时我想检查输入是否正确。
我对在处理用户信息的所有方法的开头调用__get_id
感到困惑。
我确定python可以提出更好,更轻的解决这个问题的方法。或许整个方法都是错误的,我应该实施另一个方法。
提前致谢。
class BadInputError (Exception):
pass
class Users:
def __init__(self):
pass
def __is_wrong_id(self, id):
# code to check if `id` is wrong
return False
def __get_id(self, user):
if isinstance(user, int):
ID = user
elif isinstance(user, tuple) or isinstance(user, list):
ID = user[0]
elif isinstance(user, dict) and user.has_key('id'):
ID = user['id']
else:
raise BadInputError
if self.__is_wrong_id(ID):
raise BadInputError
return ID
def check_user(self, user):
uID = self.__get_id(user)
# ...
def delete_user(self, user):
uID = self.__get_id(user)
# ...
def assign_new_role_to(self, user):
uID = self.__get_id(user)
# ...
答案 0 :(得分:0)
这里__get_id(self, user)
尝试看似超载,但是你是对的 - 通常认为检查变量是否是给定类的实例是不好的做法。在你的定义中,你只需要提取元组或列表的第一个元素,并希望它对应于ID。
相反,您应该努力创建支持__get_id()
方法的用户包装。
答案 1 :(得分:0)
很难用这个剥离的代码告诉我,但我在这里看到的问题是没有一种方法实际上使用自我(除了调用___get_id
- 这不是没有使用self
)。
通常一个类存储数据和相关方法 - 如果你只有方法,那么它应该是一个模块。
在这里,#34;用户"要知道它的ID,所以可能值得创建一个"用户"使用__get_id
函数存储属性(self.id
)的类。然后Users
类(代表User
s的集合)可以检查user.id
。 e.g:
class User(object):
def __init__(self, initialize_data):
self.__set_id(intialize_data)
def __set_id(self, data):
if isinstance(user, int):
self.id = user
elif isinstance(user, (tuple, list)):
self.id = user[0]
elif isinstance(user, dict) and user.has_key('id'):
self.id = user['id']
else:
raise BadInputError
class Users(object):
def __init__(self):
self.users = []
def delete_user(self, user):
self.users = [u for u in self.users if u.id != user.id]
请注意,此示例实现远非最佳 - 它旨在显示我将如何构造代码。可能会进行一系列改进以使其更有效(即,User
可能基于id
可散列,在这种情况下Users.users
可能是set
)。