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实例,而不是类本身" 我的代码有问题吗? 谢谢!
答案 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实例调用。