Skip to main content
 首页 » 编程设计

python之对象仅在使用 "from"导入时可调用 (Python)

2025年05月04日9zhenyulu

按照在线教程,我输入了以下代码:

class Car: 
    # define and initialize some attributes of Car object 
    def __init__(self): 
        self.speed = 0 
        self.odometer = 0 
        self.time = 0 
 
    # 'get' function for current speed 
    def say_state(self): 
        print("I'm going {} kph!".format(self.speed)) 
 
    # 'set' function for current speed 
    def accelerate(self): 
        self.speed += 5 
 
    # 'set' function for current speed 
    def brake(self): 
        self.speed -= 5 
 
    # 'set' function for trip time and distance 
    def step(self): 
        self.odometer += self.speed 
        self.time += 1 
 
    # 'get' function for average speed 
    def average_speed(self): 
        return self.odometer / self.time 
 
 
if __name__ == "__main__": 
    my_car = Car() 
    print("I'm a car") 
    while True: 
        action = input("What should I do? [A]ccelerate, [B]rake, " 
                       "show [O]dometer, or show average [S]peed").upper() 
        if action not in "ABOS" or len(action) != 1: 
            print("I don't know how to do that.") 
            continue 
        if action == "A": 
            my_car.accelerate() 
        elif action == "B": 
            my_car.brake() 
        elif action == "O": 
            print("My car has driven {} kilometers".format(my_car.odometer)) 
        elif action == "S": 
            print("My car's average speed was {} kph".format(my_car.average_speed())) 
 
        my_car.step() 
        my_car.say_state() 

然后,我中断了教程,因为它没有告诉我 if __name__ == "main" 业务是关于什么的。在其他地方阅读,我有点理解如果模块没有作为主类运行,而是被导入,这个语句会阻止 if 语句后面的代码执行。因此,为了对此进行测试,我输入了另一个小模块“import_practice.py:

import Car 
 
corolla = Car() 
corolla.say_state() 

这段代码无法运行,出现错误“Car is not callable”,所以我认为我的导入是错误的。我用 from Car import Car 替换了 import Car 并且它起作用了,但是根据 following answer ,应该没什么区别吧?事实上,如果这个答案是正确的,那根本不是我想要从我的进口中摆脱出来的行为。

请您参考如下方法:

如果你这样做:

import Car 

那么你的代码应该是:

corolla = Car.Car() 
corolla.say_state() 

当你“导入”一个模块时,你并没有将它的所有组件都带到当前的命名空间中。你只是在加载它。如果您想引用该模块上的组件,您必须通过其模块名称引用它:Car.Car。这里,第一个 Car 是模块的名称,第二个是类的名称。

如果你真的想将所有模块的组件导入当前命名空间,你可以执行from Car import *。但我不建议这样做。

之后,您执行了from Car import Car。在这里,这句话表明您正在将 Car 模块中的名称 Car 带到当前命名空间。因此,您可以在这之后对您的代码使用 Car。

请注意,您所指的答案并不是说 import Car 与 from Car import Car 相同。