class A: def __new__(self): self.__init__(self) print("A's __new__() invoked") def __init__(self): print("A's __init__() invoked") class B(A): def __new__(self): print("B's __new__() invoked") def __init__(self): print("B's __init__() invoked") def main(): b = B() a = A() main()
时间: 2023-06-11 09:09:58 浏览: 74
这段代码定义了两个类 A 和 B,其中 B 继承自 A。在 main() 函数中,分别创建了 A 和 B 的实例。运行代码会输出以下内容:
```
B's __new__() invoked
A's __new__() invoked
A's __init__() invoked
B's __init__() invoked
A's __init__() invoked
```
可以看出,当创建 B 的实例时,先调用了 B 的 __new__() 方法,然后调用了 A 的 __new__() 方法。接着,先调用了 A 的 __init__() 方法,再调用了 B 的 __init__() 方法。最后,又调用了 A 的 __init__() 方法。
这是因为在创建对象时,先调用类的 __new__() 方法创建对象实例,再调用 __init__() 方法进行初始化。在继承关系中,如果子类没有实现 __new__() 方法,那么父类的 __new__() 方法会被调用。而如果子类实现了 __new__() 方法,那么父类的 __init__() 方法仍然会被调用。
相关问题
class A: def __init__(self): self.x = 1 self.__y = 1 def gety(self): return self.__y a = A() print(a.__y)
在代码中,类`A`定义了一个构造方法`__init__()`和一个实例方法`gety()`。构造方法没有接受参数,但是在初始化过程中,将实例变量`x`和私有实例变量`__y`分别初始化为1。实例方法`gety()`返回私有实例变量`__y`的值。然后,创建了一个类`A`的实例`a`。
在调用`print(a.__y)`的语句中,试图直接访问私有实例变量`__y`。然而,私有实例变量`__y`以两个下划线开头,Python会自动对其进行名称修饰,以避免与其他类的实例变量冲突。因此,在类的外部,使用`a.__y`的方式是无法访问私有实例变量`__y`的。如果尝试这样做,会引发`AttributeError`异常。
正确的代码应该是这样的:
```python
class A:
def __init__(self):
self.x = 1
self.__y = 1
def gety(self):
return self.__y
a = A()
print(a.gety()) # 输出 1
```
在上面的代码中,创建了一个类`A`的实例`a`,然后调用`a.gety()`方法来获取私有实例变量`__y`的值,输出1。这样,就可以间接地访问私有实例变量`__y`的值,而不需要直接使用名称来访问。
class A: def __new__(self): self.__init__(self) print("A's __new__() invoked") def __init__(self): print("A's __init__() invoked") class B(A): def __new__(self): print("B's __new__() invoked") def __init__(s
elf):
print("B's __init__() invoked")
b = B()
在运行这段代码时,输出的结果是:
B's __new__() invoked
A's __init__() invoked
B's __init__() invoked
这是因为在创建B类的实例b时,首先会调用B类的__new__()方法来创建实例对象,然后再调用实例对象的__init__()方法来初始化实例。由于B类没有定义__new__()方法,所以调用的是其父类A的__new__()方法。在A的__new__()方法中,首先调用了A的__init__()方法,然后输出"A's __new__() invoked"。接着返回一个A类的实例对象,这个实例对象会被传递给B类的__init__()方法,用于初始化B类的实例。因此,输出的结果是"B's __new__() invoked"、"A's __init__() invoked"和"B's __init__() invoked"。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)