将实例转换为其类的子类型(为classmethod调用super)

2024-03-29 13:27:41 发布

您现在位置:Python中文网/ 问答频道 /正文

class Parent:

    def __init__(self, name):
        self.name = name

    @classmethod
    def get(cls, name):
        return cls(name)

    def greeting(self):
        print 'Hello ' + self.name


class Child(Parent):

    @classmethod
    def get(cls, name):
        p = Parent.get(name)
        p.full_name = 'James ' + name
        return p

    def greeting(self):
        print 'Bye ' + self.full_name

如您所见,我在Childget方法中为Parent的实例添加了一个属性full_name,问题是,现在的实例如果仍然是Parent类型,我如何将其转换为Child?你知道吗


Tags: 实例nameselfchildgetreturninitdef
2条回答

您不需要更改返回对象的类型。您需要做的是使用子类的方法正在使用的cls调用父类的方法实现。这是^{}的目的之一。首先,您需要确保使用的是新样式的类:

class Parent(object):
    # continue as usual

Python有两个类系统的实现,因为它们第一次没有正确地实现。始终从object继承如果您不是从其他任何东西继承,以确保您使用的是更新、更好的系统。你知道吗

现在,super。不要使用Parent.get(name),而是使用super调用:

p = super(Child, cls).get(name)

p将具有正确的类型,因为父方法中的cls与子方法中的cls是同一类。(请注意,如果以后添加了Grandchild类,此行将生成Grandchild对象,而不是Child对象。这很可能是正确的行为。)

使对象成为父基类:

class Parent(object):

然后将Childp = Parent.get(name)中的这一行更改为:

p = super(Child, cls).get(name)

这样super(Child, cls).get(name)将cls(Child)绑定到父get方法,因此在结果中Parent.get将用Child类作为cls参数调用。当然,要实现这一点,您需要新的样式类来解释为什么object应该在Parent基中!你知道吗

相关问题 更多 >