我想在我工作的一个Python程序使用一个小的产业。 我有一个基类,用户,它实现所有的用户的功能。 我加入未经批准的用户,这就像一个用户,在添加了一个方法的概念。
User类有一些方法,返回一个User对象。 当我继承这是行不通的,因为我最终将不得不一个UnapprovedUser返回用户,阻止我调用此方法,等等。
class User(object):
base_dn = 'ou=Users,dc=example,dc=org'
@classmethod
def get(cls, uid):
ldap_data = LdapUtil.get(uid + ',' + self.base_dn)
return User._from_ldap(ldap_data)
class UnapprovedUser(User):
base_dn = 'ou=UnapprovedUsers,dc=example,dc=org'
def approve(self):
new_dn = '' # the new DN
LdapUtil.move(self.dn, new_dn)
该get()
和_from_ldap()
方法有两个类是相同的,虽然get()
在UnapprovedUser方法需要返回一个UnapprovedUser对象,而不是用户。
我怎样才能投,我从获取用户的实例之一User.get()
到UnapprovedUser?
我想要做的事,如:
class UnapprovedUser(User):
# continued from before
@classmethod
def get(cls, uid):
user = super(UnapprovedUser, cls).get(uid)
return (UnapprovedUser) user # invalid syntax
这样我可以从父包的方法和简单地把返回的值,以正确的类。 再说,做这样可能会导致使用它们的价值父self.base_dn
,这将打破一切。
而不是“铸造”,我觉得你真的想创建一个UnapprovedUser
而不是User
调用时UnapprovedUser.get()
要做到这一点:
更改User.get
实际使用cls
则传递式的说法:
@classmethod
def get(cls, uid):
ldap_data = LdapUtil.get(uid + ',' + self.base_dn)
return cls._from_ldap(ldap_data)
你需要做类似的东西_from_ldap
。 你没有列出代码_from_ldap
,但我认为,在某些时候它确实是这样的:
result = User(... blah ...)
你要替换此:
result = cls(... blah ...)
记住:在Python类对象是构造一个类的实例可调用。 所以,你可以使用cls
一类方法的参数来构建用于调用类方法的类的实例。
Python是一种动态类型语言,所以“铸造”的概念并不存在。 如果对象已经是UnapprovedUser
,那么你已经可以调用存在在类的所有方法,而无需进行转换。
在一类的方法,所述类是在CLS参数传递英寸 因此,而不是User.something做cls.something。 完成!
这就是说,我不知道我会用两种类型的用户这样做。 我不是100%肯定你的意思是“已批准”什么在这里,我在我看来是两件事情之一。
这可能意味着用户是不是真的登录呢。 在这种情况下,我有一个特殊的匿名用户实例的用户没有登录。 既然你是审批时移动DN,这似乎更可能是你在做什么。
这可能意味着用户还没有被批准为正式成员或东西。 这只是允许处理特殊情况下,你可能会落得希望以后能有更多的权限。 我想,而不是增加对给用户角色和做出“批准”作用的支持。
如果你的意思是别的东西经批准,随意忽略这一点。 :-)
class User(object):
@classmethod
def get(cls, uid):
return User()
class UnapprovedUser(User):
@classmethod
def get(cls, uid):
user = super(UnapprovedUser, cls).get(uid)
return user # invalid syntax
print UnapprovedUser.get("XXX")
它打印用户对象,而不是在这里UnapprovedUser对象想要UnapprovedUser.get返回UnapprovedUser,对于您可以创建一个工厂函数,西港岛线返回相应的用户,并且比LDAP填充
class User(object):
@classmethod
def get(cls, uid):
return cls.getMe()
@classmethod
def getMe(cls):
return cls()
class UnapprovedUser(User):
@classmethod
def get(cls, uid):
user = super(UnapprovedUser, cls).get(uid)
return user
print UnapprovedUser.get("XXX")
它打印UnapprovedUser对象