python - 当您从 Python 中的模块而不是类继承时会发生什么?

标签 python class inheritance module python-internals

我最近遇到了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/

相关文章:

java - 如何修复名称错误: Java error in HecDSS Python Script

python - 从python中的父文件调用

Javascript函数作为类参数?

python - 在ubuntu上设置Python变量环境

python - 阿克曼函数与 n 个嵌套循环

class - 将python类拆分为多个文件

javascript - Jquery 将 css 样式应用于除鼠标悬停图像之外的具有特定类的所有元素

c++ - 依赖循环

python - pandas.DataFrame 子类的属性在 pickle 后消失

java - 当类实现接口(interface)时,该类是否继承接口(interface)中声明的抽象内部类?