【问题标题】:Python - Instantiating a class without assigning a name to the instancePython - 在不为实例分配名称的情况下实例化一个类
【发布时间】:2021-06-03 04:58:11
【问题描述】:

这里是 Python 新手!

下面的例子是关于实例化一个类然后为实例分配一个名称与实例化而不分配的区别。

在示例的最后三行中,首先在实例(my_city)上调用该方法,然后在没有实例的情况下调用该方法。所以:

  1. 有什么区别?
  2. 什么时候认为这种方法有用或更可取?
  3. 既然 Python 中的一切都是对象,那么 whatwhere 是最后一行中的对象吗?
class City:
    def __init__(self, name):
        self.name = name

    def show_city_name(self):
        print(self.name)

my_city = City("Tokyo")
my_city.show_city_name()

City("Tokyo").show_city_name()

【问题讨论】:

  • 最后一行是用实例调用的,只是你没有将实例分配给变量。
  • 执行此代码可能有助于查看实际发生的情况,尤其是临时创建的无数对象。
  • my_city 不是实例/对象 - 它是一个引用对象的名称。表达式City("Tokyo") 创建一个对象,无论它是被分配、使用还是丢弃。
  • @MisterMiyagi 所以只是为了确认一下,一旦方法调用完成,对象就会被创建并丢弃。我知道(技术上)它可能不会立即被垃圾收集,但从概念上讲,它在此代码运行中的目的已经结束。是的,我将名称与实际对象混淆了,但现在区别很明显了。谢谢大家。

标签: python class instantiation identifier


【解决方案1】:

City("Tokyo").show_city_name() 语句导致创建类型为 <class '__main__.City'> 的临时实例,在该实例上调用 show_city_name() 方法。

所以,实例仍然被创建,认为它没有绑定任何对它的引用。我们可以在City("Tokyo") 表达式中说该对象。看看这个:

>>> type(City('Foo'))
<class '__main__.City'> # Means it is an instance of the City class

当您拥有static 类方法或@classmethod 装饰器时,可以看到几乎相同类型的方法(似乎直接在类上调用方法)。例如:

class Circle:
    def __init__(self, radius):
        self.radius = radius

    # other definitions

    @classmethod
    def unit_circle(cls):
        return cls(1)

unit_c = Circle.unit_circle()

print(unit_c.radius)
# Prints 1

这是在现实世界的代码中做同样事情的更正确和更有可能的方式。

【讨论】:

    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多