python静态方法的作用_Python中的静态方法?

我觉得史蒂文是对的..要回答最初的问题,那么,为了设置一个类方法,只需假设第一个参数不会是一个调用实例,然后确保只从类调用该方法。

(请注意,这个答案指的是Python3.x。在Python2.x中,您将得到一个TypeError),用于调用类本身上的方法。)

例如:class Dog:

count = 0 # this is a class variable

dogs = [] # this is a class variable

def __init__(self, name):

self.name = name #self.name is an instance variable

Dog.count += 1

Dog.dogs.append(name)

def bark(self, n): # this is an instance method

print("{} says: {}".format(self.name, "woof! " * n))

def rollCall(n): #this is implicitly a class method (see comments below)

print("There are {} dogs.".format(Dog.count))

if n >= len(Dog.dogs) or n < 0:

print("They are:")

for dog in Dog.dogs:

print(" {}".format(dog))

else:

print("The dog indexed at {} is {}.".format(n, Dog.dogs[n]))fido = Dog("Fido")

fido.bark(3)Dog.rollCall(-1)rex = Dog("Rex")Dog.rollCall(0)

在此代码中,“ROLLCALL”方法假定第一个参数不是实例(如果它是由实例而不是类调用的话)。只要从类(而不是实例)调用“RORCALL”,代码就会正常工作。如果我们试图从实例中调用“唱名”,例如:rex.rollCall(-1)

但是,它将引发异常,因为它将发送两个参数:它本身和-1,并且“回籍”只定义为接受一个参数。

顺便说一句,rex.RollCall()将发送正确的参数,但也会引发异常,因为现在n表示的是一个Dog实例(即rex),而函数期望n是数字的。

这就是装饰的地方:如果我们在“唱名”方法之前使用@staticmethod

然后,通过显式声明该方法是静态的,我们甚至可以从实例中调用它。现在,rex.rollCall(-1)

会起作用的。然后,在方法定义之前插入@staticMethod,就会阻止实例将自身作为参数发送。

您可以通过在@staticMethod行注释掉的情况下尝试下面的代码来验证这一点。class Dog:

count = 0 # this is a class variable

dogs = [] # this is a class variable

def __init__(self, name):

self.name = name #self.name is an instance variable

Dog.count += 1

Dog.dogs.append(name)

def bark(self, n): # this is an instance method

print("{} says: {}".format(self.name, "woof! " * n))

@staticmethod

def rollCall(n):

print("There are {} dogs.".format(Dog.count))

if n >= len(Dog.dogs) or n < 0:

print("They are:")

for dog in Dog.dogs:

print(" {}".format(dog))

else:

print("The dog indexed at {} is {}.".format(n, Dog.dogs[n]))fido = Dog("Fido")fido.bark(3)

Dog.rollCall(-1)rex = Dog("Rex")Dog.rollCall(0)rex.rollCall(-1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值