在banch方法开始时运行一些方法(python)

时间:2014-09-17 06:42:27

标签: python design-patterns methods

可能是我做错了,所以告诉我如何做得更好。 用户说,我正在为某个对象的所有实例实现一个类。 (看起来像M. Fowler的“企业应用程序架构模式”中的模式'表模块')。我附上了我的实现的简化示例。

user参数可能有不同的类型:

  • just int ID
  • 包含用户信息的字典。它有其他
  • id
  • 元组或列表,ID为索引为0的元素

我想确定输入变量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)
        # ...

2 个答案:

答案 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 )。