Python 简明教程

Python - Class Methods

Methods 从属某个类的对象,用来执行特定的操作。我们可以将 Python 方法分为三种不同的类别:类方法、实例方法和静态方法。

Python class method 是绑定到该类的一种方法,而不是它的实例。它可以在类本身上调用,而不是该类的实例。

许多人常常混淆类方法和静态方法。需要记住的是,虽然这两种方法都是在类上调用的,但是 static methods 无法访问"cls"参数,因此它无法修改类的状态。

不同于类方法, instance method 类的 variables 可以访问对象的实例。此外,它还可以访问类变量,因为其在所有对象中都是通用的。

Creating Class Methods in Python

在 Python 中创建类方法有两种方式:

  1. Using classmethod() Function

  2. Using @classmethod Decorator

Using classmethod() Function

Python 内置函数 classmethod() 将实例方法转换为 class method ,该方法仅使用类引用来调用,而不用对象。

Syntax

classmethod(instance_method)

Example

在 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()

Output

使用对象调用 showcount(),使用类调用 count(),两者都显示了员工计数的值。

3
3

Using @classmethod Decorator

使用 @classmethod() 装饰器时,需要定义一个类方法,因为它比先声明一个实例方法,然后再将其转换为类方法更便捷。

Syntax

@classmethod
def method_name():
   # your code

Example

类方法作为备用构造器。使用构造新对象所需的参数定义一个 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

Access Class Attributes in Class Method

类属性是属于类的那些变量,其值是该类所有实例共享的。

若要在类方法中访问类属性,使用 cls 参数,后接点号 (.) 和属性名称。

Example

在该示例中,我们在类中访问一个类属性。

class Cloth:
   # Class attribute
   price = 4000

   @classmethod
   def showPrice(cls):
      return cls.price

# Accessing class attribute
print(Cloth.showPrice())

在运行以上代码时,它将显示以下输出:

4000

Dynamically Add Class Method to a Class

Python 的 setattr() 函数用于设置动态属性。如果要向类中添加一个类方法,将该方法名称作为参数值传递给 setattr() 函数。

Example

以下示例显示如何动态向 Python 类添加类方法。

class Cloth:
   pass

# class method
@classmethod
def brandName(cls):
   print("Name of the brand is Raymond")

# adding dynamically
setattr(Cloth, "brand_name", brandName)
newObj = Cloth()
newObj.brand_name()

执行以上代码时,将显示以下输出 −

Name of the brand is Raymond

Dynamically Delete Class Methods

Python del 运算符用于动态删除类方法。如果您尝试访问被删除的方法,代码将引发 AttributeError。

Example

在以下示例中,我们使用 del 运算符删除名为“brandName”的类方法。

class Cloth:
   # class method
   @classmethod
   def brandName(cls):
      print("Name of the brand is Raymond")

# deleting dynamically
del Cloth.brandName
print("Method deleted")

执行以上代码时,将显示以下输出 −

Method deleted