Python代码中Database类自动实例化及终端提前输出问题解析
问题解答
先贴出完整代码:
from abc import * class Myclass(ABC): @abstractmethod def connect(self): pass @abstractmethod def disconnect(self): pass class Oracle(Myclass): def connect(self): print("Connecting to Oracle database") def disconnect(self): print("Disconnecting fron Oracle") class Sybase(Myclass): def connect(self): print("Connecting to Sybase database") def disconnect(self): print("Disconnecting fron Sybase") class Database: str = input("Enter database name: ") classname = globals()[str] obj = classname() obj.connect() obj.disconnect()
1. Database类并没有被自动实例化
这段代码里完全没有实例化Database类的操作——你找不到db = Database()或者Database()这种创建类实例的语句。代码只是定义了Database这个类,从头到尾都没创建过它的实例。
2. 终端直接显示输入提示的原因
因为你把input()这些代码写在了类的顶层作用域里,属于类属性的定义代码。Python在加载并解析类定义的时候,会立即执行类内部顶层的所有代码,不管你有没有创建这个类的实例。
简单说:当Python读到class Database:这段代码时,就会依次执行里面的str = input(...)、classname = globals()[str]等语句,所以程序一运行到解析Database类的步骤,就会立刻弹出输入提示,跟有没有实例化这个类完全没关系。
内容的提问来源于stack exchange,提问作者Swayam Badhe
相关产品推荐
相关产品推荐

