7

我一直在寻找最好的方法,但我还没有真正找到任何完全令人信服的东西。

我正在编写一个系统,其中有用户对象和管理这些用户的集合。每个用户都有一个名称,我想在管理器中指定一个函数,该函数可以采用用户的名称或用户对象本身。

class UserManager: 
  def remove_user(self,user_or_username):
    #If user_or_username is a string
    remote.remove(user_or_username)
    #If user_or_username is a User object
    remote.remove(user_or_username.name)

有什么漂亮的方法可以做到这一点,或者是使用 isinstance 吗?

4

4 回答 4

5

mgilson's的解决方案,但略有不同:

def remove_user(self,user_or_username):
    try:
        #If user_or_username is a User object
        username = user_or_username.name
    except AttributeError:   #Oops -- didn't works.  ask forgiveness ;-)
        #If user_or_username is a string
        username = user_or_username
    remote.remove(username)

为什么?因为这样一来,AttributeErrors inremove()就不会被抑制。

这可能无关紧要,但我更喜欢将异常处理集中在我真正想要拥有它们的地方。

于 2012-05-15T13:03:05.927 回答
3

usingisinstance是一种很好的方法...此解决方案还有另一种方法

if hasattr(user_or_username, 'name'):
    # this object has <name> attribute
    remote.remove(user_or_username.name)
else:
    remote.remove(user_or_username)
于 2012-05-15T13:02:35.177 回答
2

有时候蟒蛇人喜欢说“求原谅不如求许可”……

  def remove_user(self,user_or_username):
    try:
        #If user_or_username is a User object
        remote.remove(user_or_username.name)
    except AttributeError:   #Oops -- didn't works.  ask forgiveness ;-)
        #If user_or_username is a string
        remote.remove(user_or_username)

但我说这只是一个偏好问题。isinstance如果你知道你只会得到字符串或User实例,你也可以很容易地使用。

于 2012-05-15T12:58:58.797 回答
2

我会使用isinstance,但这也有效:

def remove_user(self, user):
   if hasattr(user, "name"):
      self.remove(user.name)
   else:
      self.remove(user)
于 2012-05-15T13:00:55.727 回答