在您的第一条语句中,您只是将 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()