方法属于类的对象,用于执行特定的操作。我们可以将 Python 方法分为三类:类方法、实例方法和静态方法。
Python 类方法是绑定到类而不是类的实例的方法。它可以被类本身而不是类的一个实例调用。
我们大多数人常常混淆类方法和静态方法。始终记住,虽然两者都可以在类上调用,但静态方法没有访问 "cls" 参数的能力,因此它不能修改类的状态。
不同于类方法,实例方法可以访问一个对象的实例变量。它也可以访问类变量,因为这是所有对象共有的。
在 Python 中创建类方法
创建类方法有两种方法:
使用 classmethod()
函数
Python 有一个内置函数 classmethod()
,它可以将一个实例方法转换为类方法,该方法只能通过类引用而不是对象来调用。
语法
classmethod(instance_method)
示例
在 Employee
类中,定义一个带有 "self" 参数(指向调用对象的引用)的 showcount()
实例方法。它打印 empCount
的值。接下来,将方法转换为可以通过类引用访问的类方法 counter()
。
class Employee:
empCount = 0
def __init__(self, name, age):
self.__name = name
self.__age = age
Employee.empCount += 1
def showcount(self):
print (self.empCount)
counter = classmethod(showcount)
e1 = Employee("Bhavana", 24)
e2 = Employee("Rajesh", 26)
e3 = Employee("John", 27)
e1.showcount()
Employee.counter()
输出
使用对象调用 showcount()
并使用类调用 counter()
,两者都显示员工计数的值。
3
3
使用 @classmethod
装饰器
使用 @classmethod
装饰器是定义类方法的推荐方式,因为它比先声明实例方法再将其转换为类方法更方便。
语法
@classmethod
def method_name(cls):
示例
类方法作为备选构造器。定义一个带有构造新对象所需参数的新方法 newemployee()
。它返回构造的对象,就像 __init__()
方法一样。
class Employee:
empCount = 0
def __init__(self, name, age):
self.name = name
self.age = age
Employee.empCount += 1
@classmethod
def showcount(cls):
print (cls.empCount)
@classmethod
def newemployee(cls, name, age):
return cls(name, age)
e1 = Employee("Bhavana", 24)
e2 = Employee("Rajesh", 26)
e3 = Employee("John", 27)
e4 = Employee.newemployee("Anil", 21)
Employee.showcount()
现在有四个 Employee
对象。如果我们运行上述程序,它将显示 Employee
对象的数量:
4
在类方法中访问类属性
类属性是属于类的那些变量,并且其值在该类的所有实例之间共享。
要在类方法中访问类属性,请使用 cls
参数后跟点 (.) 符号和属性名称。
示例
在这个例子中,我们在类方法中访问一个类属性。
class Cloth:
price = 4000
@classmethod
def showPrice(cls):
return cls.price
print(Cloth.showPrice())
输出
运行上述代码,它将显示以下输出:
4000
动态向类添加类方法
Python setattr()
函数用于动态设置属性。如果你想向类添加一个类方法,将方法名作为参数值传递给 setattr()
函数。
示例
下面的例子展示了如何动态地向 Python 类添加一个类方法。
class Cloth:
pass
@classmethod
def brandName(cls):
print("Name of the brand is Raymond")
setattr(Cloth, "brand_name", brandName)
newObj = Cloth()
newObj.brand_name()
输出
当我们执行上述代码时,它将显示以下输出:
Name of the brand is Raymond
动态删除类方法
Python del
操作符用于动态删除类方法。如果你试图访问已删除的方法,代码将引发 AttributeError
。
示例
在下面的例子中,我们正在使用 del
操作符删除名为 "brandName" 的类方法。
class Cloth:
@classmethod
def brandName(cls):
print("Name of the brand is Raymond")
del Cloth.brandName
print("Method deleted")
输出
执行上述代码,它将显示以下输出:
Method deleted