如何你施放一个实例派生类?(How do you cast an instance to a der

2019-07-30 03:14发布

我想在我工作的一个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 ,这将打破一切。

Answer 1:

而不是“铸造”,我觉得你真的想创建一个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一类方法的参数来构建用于调用类方法的类的实例。



Answer 2:

Python是一种动态类型语言,所以“铸造”的概念并不存在。 如果对象已经是UnapprovedUser ,那么你已经可以调用存在在类的所有方法,而无需进行转换。



Answer 3:

在一类的方法,所述类是在CLS参数传递英寸 因此,而不是User.something做cls.something。 完成!

这就是说,我不知道我会用两种类型的用户这样做。 我不是100%肯定你的意思是“已批准”什么在这里,我在我看来是两件事情之一。

  1. 这可能意味着用户是不是真的登录呢。 在这种情况下,我有一个特殊的匿名用户实例的用户没有登录。 既然你是审批时移动DN,这似乎更可能是你在做什么。

  2. 这可能意味着用户还没有被批准为正式成员或东西。 这只是允许处理特殊情况下,你可能会落得希望以后能有更多的权限。 我想,而不是增加对给用户角色和做出“批准”作用的支持。

如果你的意思是别的东西经批准,随意忽略这一点。 :-)



Answer 4:

  • 超(UnapprovedUser,个体经营)是错误的,应该是超(UnapprovedUser,CLS),因为在类方法,你没有可用的自

  • 我会重申你的问题,在基类要创建用户并以某种方式要返回派生类如


   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对象



文章来源: How do you cast an instance to a derived class?