super()不能与type()一起使用? :super(type,obj):obj必须是类型的实例或子类型

时间:2017-05-04 12:29:08

标签: python

在代码中,new_type是一个使用类X的成员创建并从类A派生的类。任何TypeError的解决方法?

class A:
    def __init__(self):
        pass

    def B(self):
        pass
    def C(self):
        pass

class X:
    def __init__(self):
        print(type(self).__bases__)
        super().__init__()

    def B(self):
        self.B()
    def Z(self):
        pass

a = X()
print('ok')
new_type = type("R", ( A,), dict(X.__dict__))
some_obj = new_type()

节目输出:

(<class 'object'>,)
ok
(<class '__main__.A'>,)
Traceback (most recent call last):
  File "c:\Evobase2005\Main\EvoPro\dc\tests\sandbox.py", line 37, in <module>
    some_obj = new_type()
  File "c:\Evobase2005\Main\EvoPro\dc\tests\sandbox.py", line 27, in __init__
    super().__init__()
TypeError: super(type, obj): obj must be an instance or subtype of type

在生产代码中,类A也不存在,但也是动态创建的,因为它使用来自c ++库的资源进行类构造。因此扭曲的代码。 ;)

编辑这也失败了。

class X:
    def __init__(self):
        print(type(self).__bases__)
        super().__init__()

    def Z(self):
        pass

new_type = type("R", (object, ), dict(X.__dict__))
some_obj = new_type()

1 个答案:

答案 0 :(得分:0)

@Override public void onResponse(Call call, final okhttp3.Response response) throws IOException { final String stringResponse = response.body().string(); //insted of sample pass the stringresponse it will work JSONObject bookObject = new JSONObject(stringResponse); JSONArray booksArray = bookObject.getJSONArray("books"); for (int i = 0; i < booksArray.length(); i++){ JSONObject currentBook = booksArray.getJSONObject(i); String title = currentBook.getString("title"); String author = currentBook.getString("author"); String isbn = currentBook.getString("isbn"); Book book = new Book(title,author,isbn); books.add(book); } }); 有两种形式,二参数形式和零参数形式quoting standard library docs

  

两个参数形式准确地指定了参数并进行了适当的引用。零参数形式仅在类定义内起作用,因为编译器会填充必要的详细信息以正确检索要定义的类,以及为常规方法访问当前实例。

零参数形式将不起作用,因为它会自动在堆栈框架中搜索类(super())和第一个参数,并感到困惑。

但是,当您使用__class__的两个参数形式时,代码可以正常工作:

super()

输出:

class A:
    def __init__(self):
        pass

class X:
    def __init__(self):
        print(type(self).__bases__)
        super(self.__class__, self).__init__()

x = X()

R = type("R", (A,), dict(X.__dict__))
obj = R()

尽管在呼叫层次结构中,您不能多次使用(<class 'object'>,) (<class '__main__.A'>,) ,否则会遇到无限递归,请参见this SO answer