仅当使用“from”导入时才可调用对象(Python)

2024-06-23 18:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

根据在线教程,我输入了以下代码:

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”_练习.py地址:

import Car

corolla = Car()
corolla.say_state()

此代码无法运行,错误为“Car is not callable”,因此我认为我的导入是错误的。我用from Car import Car替换了import Car,它工作了,但是根据following answer,它不会有什么区别,对吧?事实上,如果这个答案是正确的,那根本不是我想要从导入中摆脱出来的行为。你知道吗


Tags: importselfforiftimemydeffunction
3条回答

如果您这样做:

import Car

那么你的代码应该是:

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

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

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

在那之后,你做了from Car import Car。在这里,这句话说明您正在将名称CarCar模块带到当前名称空间。因此,在此之后,您可以在代码中使用Car。你知道吗

请注意,你所指的答案并不是说import Carfrom Car import Car相同。你知道吗

进口问题

如果您有一个名为Car.py的文件,并调用import Car,则会将整个模块添加到当前作用域中。你知道吗

import Car
print(dir(Car))
# [ ... 'Car' ]

这意味着您还可以执行以下操作:

# import the module and alias it
import Car as c

# add class to local scope as `Car`
Car = c.Car

另一方面,如果您使用from关键字,您将在该模块中获得一些内容并将其添加到当前范围:

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

这是什么废话?你知道吗

调用文件python <my-file-name>时,它将特殊变量__name__设置为字符串__main__if __name__ == '__main__'翻译为“如果有人试图将其作为独立脚本运行,那么请执行以下操作”。另一方面,如果有人在同一个文件上调用import,则该区域将而不是触发。你知道吗

线路

import Car

加载模块Car,并使其声明的所有内容(即Car)在命名空间Car中可用。你知道吗

线路

from Car import Car

加载模块Carfrom Car import部分),然后使该模块中声明的名称Car(即Car)在当前命名空间中可用。也就是说

import Car
Car.Car()

相当于

from Car import Car
Car()

除了全局名称空间中的名称Car所指的以外(整个模块,或者只是一个类)。你知道吗

注意,import语句还支持as。这样,您就可以更改当前命名空间中给定的名称:

import Car as CarModule
CarModule.Car()

以及

from Car import Car as CarClass
CarClass()

也要和另外两个做同样的事情,除了名字。你知道吗

相关问题 更多 >

    热门问题