gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:49:14 25 4
gpt4 key购买 nike

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

你可以创建一个虚拟的 BaseClass 来测试它

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com