【问题标题】:Creating instances of a class using Python使用 Python 创建类的实例
【发布时间】:2020-12-25 08:18:28
【问题描述】:

() 在 Python 中创建类的实例时实际上做了什么。 我可以通过

创建类
class class_A:
    pass

但是当我尝试调用它时

instance_of_A = class_A 
type(instance_of_A)

我得到<class 'type'> 返回

但是当我使用括号时:

instance_of_A =class_A()
type(instance_of_A)

我收到<class '__main__.classA'>

我知道这很重要,但我不明白为什么。

【问题讨论】:

  • "但是当我尝试调用它时:instance_of_A = class_A " 那没有调用它。括号调用某事。没有括号,你什么都不会调用。这对于任何可调用对象都是一样的,例如函数,或实现__call__ 方法的用户定义对象,它允许您创建可调用对象
  • 括号表示调用任何对象、类或函数,例如在 python 中,如果你在任何 DataFrame 上执行(columns/index/unique) 之类的操作,则它不是可调用函数,但是当你使用sort()/value_sort() 之类的东西时,它们是可调用,因为它们带来了支持参数的操作函数

标签: python class constructor


【解决方案1】:

在您的第一条语句中,您只是将 A 类分配给变量“instance_of_A”。 在您的第二条语句(使用括号的地方)中,您实际上是在创建 A 类的实例。

我认为您需要对 Python 中的 OOP 有一点了解。 让我解释一下 OOP 在 python 中的工作原理:

类就像一个蓝图,而实例就像该蓝图(类)的产品。你只能使用对象而不是类(不是说静态方法)

class Phone:
__balance = 0
__numberOfCalls = 0
def __init__(self):
    self.__balance = 1
    print("Yeah!, New Phone")

def makeCall(self):
    if self.__balance < 1:
        print('Please recharge and try again')
        return
    self.__numberOfCalls += 1
    self.__balance -= 1
    print("Making call %d" %(self.__numberOfCalls))

在上面的例子中,我们有一个简单的例子类Phone。

samsung = Phone()    # Yeah!, New Phone
samsung.makeCall()   # Making call 1
samsung.makeCall()   # Please recharge and try again

这里可以清楚的了解到Phone类(__balance, __numberOfCalls)中的变量属于创建的实例(Samsung)。在我们的示例中,三星无法拨打第二个电话,因为它的余额为零(注意:三星的余额为零,而不是手机)。如果您创建一个新手机(可能是一加),您可以拨打另一个电话。

括号对类有什么作用?

当您调用一个类时,它会返回该类的一个新实例。但是,如果您只是将其分配给变量而不调用它,则不会创建任何实例。

apple = Phone
apple.makeCall()    # TypeError: makeCall() missing 1 required positional argument: 'self'

这抛出了一个错误(这是预期的),因为我们没有调用 Phone,所以它不会返回 Phone 的实例,而是我们将 Phone(class) 分配给苹果。
如果您来自其他语言(例如 javascript),则可能会出现“方法未找到异常”。但这里我们得到的是类型错误,缺少位置参数“self”

Python 将它自己的实例作为它的第一个参数 self(名称 self 只是一个约定,而不是关键字),这就是我们在所有方法声明中编写 self 的原因。我们不必将实例作为参数传递,当您从实例调用方法时,python 会处理它。

又来了一个新问题……

apple = Phone
apple.makeCall(samsung)

上面的代码会起作用吗?

是的,正如我所说,当您通过实例本身调用方法时,您不必将实例作为参数传递。这里 apple 只是一个类(不是实例),根据前面的错误,我们传递了所需的位置参数 Samsung(它是 Phone 的实例)。这类似于下面的代码。

samsung.makeCall()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多