在代码中,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()
答案 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。