python类用法(三)
一、类的多态性
多态性是面向对象编程的三大特性之一,它指的是不同的对象对同一消息做出不同的响应。在Python中,由于它是动态类型语言,多态性自然地被支持。
python复制代码
|
class Shape: |
|
def area(self): |
|
pass |
|
|
|
class Circle(Shape): |
|
def __init__(self, radius): |
|
self.radius = radius |
|
|
|
def area(self): |
|
return 3.14 * self.radius ** 2 |
|
|
|
class Rectangle(Shape): |
|
def __init__(self, width, height): |
|
self.width = width |
|
self.height = height |
|
|
|
def area(self): |
|
return self.width * self.height |
|
|
|
def calculate_area(shape): |
|
return shape.area() # 多态性体现在这里,无论是Circle还是Rectangle对象,都可以调用area方法 |
|
|
|
circle = Circle(5) |
|
rectangle = Rectangle(4, 6) |
|
print(calculate_area(circle)) # 输出圆的面积 |
|
print(calculate_area(rectangle)) # 输出矩形的面积 |
二、元类与类的创建
元类(Metaclass)是创建类的“类”。在Python中,类本身也是对象,元类就是用来创建这些类对象的类。通常情况下,我们不需要直接操作元类,但在某些高级用法,如自动注册类、控制类的创建等场景中,元类非常有用。
python复制代码
|
class Meta(type): |
|
def __init__(cls, name, bases, dct): |
|
print(f"Creating class {name}") |
|
super().__init__(name, bases, dct) |
|
# 在这里可以对类进行额外操作,如注册、修改属性等 |
|
|
|
class MyClass(metaclass=Meta): |
|
pass |
|
|
|
# 当MyClass被定义时,会触发Meta类的__init__方法,输出:Creating class MyClass |
三、属性装饰器
Python还提供了几个内置的属性装饰器,如@property、@classmethod和@staticmethod,它们用于改变方法的行为,使其表现得像数据属性、类方法或静态方法。
1. @property
将方法转换为只读属性。
python复制代码
|
class Circle: |
|
def __init__(self, radius): |
|
self._radius = radius |
|
|
|
@property |
|
def radius(self): |
|
return self._radius |
|
|
|
@radius.setter |
|
def radius(self, value): |
|
if value < 0: |
|
raise ValueError("Radius cannot be negative") |
|
self._radius = value |
|
|
|
circle = Circle(5) |
|
print(circle.radius) # 读取属性值 |
|
circle.radius = 10 # 设置属性值 |
2. @classmethod
将方法绑定到类而不是实例,不需要实例即可调用,且第一个参数约定为表示类本身的cls。
python复制代码
|
class MyClass: |
|
@classmethod |
|
def class_method(cls): |
|
print(f"This is a class method of {cls.__name__}") |
|
|
|
MyClass.class_method() # 调用类方法 |
3. @staticmethod
将方法定义为静态方法,即方法既不与类关联也不与实例关联,只是放在类命名空间中的一个普通函数。
python复制代码
|
class MyClass: |
|
@staticmethod |
|
def static_method(): |
|
print("This is a static method") |
|
|
|
MyClass.static_method() # 调用静态方法 |