使用python中嵌套类的参数调用父方法

时间:2016-04-03 00:51:39

标签: python

class Parent(object):
    def __init__(self):
        self.text = "abc"
        self.child = self.Child()

    def run(self):
        self.child.task()

    def output(self, param1):
        print(param1)

    class Child(object):
        def __init__(self):
            self.text = "cde"

        def task(self):
            Parent.output(Parent, self.text)  # I get the warning for this line


parent = Parent()
parent.run()

上面的代码按预期工作,但IntelliJ IDEA警告我这条消息 "预期的nested_classes.Parent实例,而不是类本身" 我的代码有问题吗? 谢谢!

2 个答案:

答案 0 :(得分:3)

您正尝试将output方法(这是一种实例方法)作为类方法进行访问。消息即将发生,因为第一个参数self是实例对象,因此您传递class作为第一个参数实际上将更改self作为实例对象应具有的内容。这就是消息试图告诉你的。所以,你实际应该做的是将方法作为实例方法调用:

Parent().output(self.text)

根据您的操作,如果您在repr方法中查看self对象output和内容,则可以获得此信息:

def output(self, param1):
    print(repr(self))
    print(dir(self))
    print(param1)

使用这种调用方法:Parent.output(Parent, self.text)

<class '__main__.Parent'>
[
    'Child', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', 
    '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', 
    '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', 
    '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', 
    '__subclasshook__', '__weakref__', 'output', 'run'
]

如您所见,您的instance中没有Parent self

现在,如果您将其称为实例方法:Parent().output(self.text)

<__main__.Parent object at 0x1021c6320>
[
    'Child', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
    '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', 
    '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', 
    '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
    '__weakref__', 'child', 'output', 'run', 'text'
]

正如您所看到的,您现在拥有一个Parent对象,如果您查看对象的内容,您将拥有对实例属性的期望。

答案 1 :(得分:1)

您没有将输出声明为类方法,因此它希望由Parent实例调用。