1.引言
python是一种面向对象编程语言,类是面向对象编程中组织代码的基本单元。如果你有其它面向对象编程语言的基础,比如java,那么你一定,也应该知道面向对象编程的三大核心:封装,继承,多态。
- 封装:通过封装,隐藏对象的内部实现细节,仅暴露公共接口给外部使用。实现了信息和操作细节的隐藏。
- 继承:通过继承实现代码的可复用性和扩展
- 多态:通过多态实现了代码运行时动态特性,即根据对象的实际类型而非申明类型进行代码调用
而这一切,都要以类作为基础。下面我们来看关于python中类的方方面面!
2.类
2.1.再聊编程范式
之所以说是再聊编程范式,原因在于在之前"面向对象编程 "专栏关于编程范式,有过详尽的分享:面向过程编程,面向对象编程,函数式编程 三大编程范式。感兴趣的朋友可以看看这篇文章:juejin.cn/post/742110...。在这里,我就不重复造轮子了。
2.2.类的基本定义和使用
python中通过class关键字进行类定义的修饰。像这样:
python
#定义类
class Person:
def hello(self):
print("hello python class!")
# 实例化类,并使用
obj = Person()
obj.hello()
2.3.类的继承
继承可以实现代码的复用性。python中继承使用像这样:
python
# 定义类
class Person:
def hello(self):
print("hello python class!")
# 定义子类Student,继承Person
class Student(Person):
def hello(self):
# 调用父类hello方法,通过super()
super().hello()
print("here output Student class")
# 实例化Student并使用
obj = Student()
obj.hello()
2.4.类的装饰器
类的装饰器,在上一篇关于函数的分享文章中,有简单的提及,你可以回过头去看看。今天我要给你分享的是:@classmethod,@staticmethod,@property三个装饰器内容。
2.4.1.@classmethod
修饰定义类相关的方法,而非实例。相当于工厂方法。有两个特点:
- 第一个参数:cls,表示类本身,可用于访问类属性或创建类实例
- 子类继承父类时,自动指向子类,保持多态特性
示例:
python
# 装饰器@classmethod示例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
current_year = 2025
age = current_year - birth_year
# 创建类的实例
return cls(name, age)
# 调用类方法
p = Person.from_birth_year("小王", 2000)
print(f"小王的年龄:{p.age}")
2.4.2.@staticmethod
定义与类相关但无需访问类或实例状态的工具方法 。等价于定义一个普通函数,原本和类不相干,但是位置放到类里面,方便引用和维护管理。借鸡生蛋!其实就是在java编程语音中,定义的一个个工具类有没有
python
# 装饰器@staticmethod示例
class MathUtils:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def is_even(num):
return num % 2 == 0
# 像不像java中各种工具类
print(MathUtils.add(3, 5))
print(MathUtils.is_even(8))
2.4.3.@property
将方法转换为:属性。使得访问方法与访问属性方式一致,不需要括号。实际项目中,通常用于封装属性的验证和计算逻辑。换句话描述,等价于通用bean对象的getter/setter方法,这么说你应该就明白了。看一个示例:
python
# @property装饰器示例
class Person:
def __init__(self, name):
# 内部使用私有变量存储值
self._name = name
@property
def name(self):
print("get name...")
return self._name
@name.setter
def name(self, value):
print("set name...")
self._name = value
p = Person("小王")
# 调用 @property 的 getter.你看到了:调用方法不需要括号
print(p.name)
# 调用 @name.setter
p.name = "老王"
2.5.类的特殊方法
2.5.1.init
python中init构造方法,在创建类的实例的时候自动调用,用于完成对象属性的初始化。但是要注意,它不负责创建对象,仅仅负责初始化。真正创建对象的方法是new方法。示例:
python
class Person:
def __init__(self, name, age):
# 初始化实例属性
self.name = name
self.age = age
# 创建实例时自动调用 __init__
p = Person("小王", 30)
print(p.name)
2.5.2.call
python的神奇方法:call。它让对象实例可以像方法一样调用,在python中,当你这样使用某个对象实例,比如:obj(),实则调用的即是类中的call方法。示例:
python
class Adder:
def __init__(self, base):
# 初始化实例属性
self.base = base
def __call__(self, x):
# 调用实例时执行此方法
return self.base + x
# 创建实例
adder = Adder(10)
# 等价于调用 adder.__call__(5)
print(adder(5))
另外call方法,还可用于实现类装饰器。还记得上篇文章的这个案例吗?
python
import time
# 定义Timer类,通过__call__实现装饰器功能
class Timer:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
import time
start = time.time()
result = self.func(*args, **kwargs)
end = time.time()
print(f"耗时: {end - start:.2f}秒")
return result
@Timer
def slow_function():
time.sleep(1)
slow_function()