我最近遇到了this question .
import Object class Visitor(Object): def __init__(self): super(Visitor,self).__init__() def visit(self, obj): pass def getIsDone(self): return False isDone = property(fget =lambda self:self.getIsDone())
I get this error:
TypeError: module.__init__() takes at most 2 arguments (3 given)
及其答案:
class A:pass print(A) #outputs <class '__main__.A'> import urllib print(urllib) #outputs <module 'urllib' from '/usr/lib/python3.2/urllib/__init__.py'>
Your error is happening because Object is a module, not a class. So your inheritance is screwy.
Change your import statement to:
from Object import ClassName
and your class definition to:
class Visitor(ClassName):
or
change your class definition to:
class Visitor(Object.ClassName): etc
我对这个答案不太满意,因为我不太确定如何从该错误消息得出我不小心从模块而不是类继承的结论。我想知道是否有人可以详细说明为什么会发生此错误以及给出的参数到底是什么?当Python解释器遇到这样的代码时:
class Employee(Person)
发生了什么?回答者所说的“我的继承是扭曲的”到底是什么意思?感谢您对资源的任何解释或引用。
最佳答案
如果您将一个名为 BaseClass
的对象放入继承列表中,那么解释器将在内部调用它:
type(BaseClass).__init__(cls, name_of_subclass, (BaseClass,), dict_of_subclass)
# or simpler
type(BaseClass)(name_of_subclass, (BaseClass,), dict_of_subclass)
您可以创建一个虚拟基类来测试它
class Meta(object):
def __init__(self, name, base, subcls):
print (self, name, base, subcls)
Base = Meta('','','')
class Test(Base):
prop1="hello"
输出:
<__main__.Meta object at 0x7f7471666bd0>
<__main__.Meta object at 0x7f7471666c50> Test (<__main__.Meta object at 0x7f7471666bd0>,) {'__module__': '__main__', 'prop1': 'hello'}
回答你的问题:当解释器看到class Employee(Person): pass
时,会发生以下情况:
type(Person).__init__(cls, 'Employee', (Person,), {'__module__': '__main__'})
如果Person
是一个普通类,type(person)
将返回type
本身。然后 type.__init__
将被调用。
如果Person
是一个模块,type(person)
将返回对象module
,它有一个方法__init__
.但这个方法只需要 2 个参数,就会出现错误。
import sys
type(sys).__init__(sys,2,3,4)
#Traceback (most recent call last):
# File "testClassInheritance.py", line 11, in <module>
# type(sys).__init__(sys,2,3,4)
#TypeError: module.__init__() takes at most 2 arguments (3 given)
关于python - 当您从 Python 中的模块而不是类继承时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37876318/