gpt4 book ai didi

python - 如何将实例转换为派生类?

转载 作者:太空狗 更新时间:2023-10-29 18:04:15 26 4
gpt4 key购买 nike

我正在尝试在我正在处理的 Python 程序中使用一点继承。我有一个基类 User,它实现了用户的所有功能。我正在添加一个未批准的用户的概念,就像一个用户,添加一个单一的方法。

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)

虽然 UnapprovedUser 中的 get() 方法需要返回一个 UnapprovedUser 对象,而不是一个用户。

如何将我从 User.get() 获得的 User 实例之一转换为 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.get() 时创建一个 UnapprovedUser 而不是 User .为此:

更改 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 - 如何将实例转换为派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1120156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com