一、面向对象基本语法
摘要:本文系统介绍了 Python 面向对象编程的基本语法,涵盖类与对象的概念、属性(实例属性与类属性)、方法(实例方法、类方法与静态方法)、访问控制(封装)以及常用的特殊方法(如__init__、__str__等)。通过丰富的代码示例,帮助读者快速掌握面向对象的核心要素,为后续深入学习打下坚实基础。
1.1 什么是面向对象
面向对象是一种编程思想,把现实世界的事物抽象成对象,对象有属性(特征)和方法(行为)。
| 概念 | 解释 | 现实例子 |
|---|---|---|
| 类(Class) | 对象的蓝图/模板 | 汽车设计图 |
| 对象(Object) | 根据类创建的实例 | 具体的某辆汽车 |
| 属性(Attribute) | 对象的特征 | 颜色、品牌、价格 |
| 方法(Method) | 对象的行为 | 启动、刹车、加速 |
1.2 类的基本语法
- 定义一个类
classDog:"""这是一个狗类"""pass# 占位符,暂时什么都不做# 对象实例化car1=Car()car2=Car()print(f"car1 ={car1};\n car2 ={car2};\n type(car1) ={type(car1)};\n type(car2) ={type(car2)}")# 输出结果:# car1 = <__main__.Car object at 0x000001DBE3B363C0>;# car2 = <__main__.Car object at 0x000001DBE3BC1310>;# type(car1) = <class '__main__.Car'>;# type(car2) = <class '__main__.Car'>1.3 属性
- 实例属性(属于具体对象的)
classCar:passcar=Car()car.name='奔驰'car.color='black'print(f"car.name ={car.name}, car.color ={car.color}")# 输出结果:car.name = 奔驰, car.color = black- 使用
__init()__初始化属性(推荐)
classCar:def__init__(self,name,color,money):self.name=name self.color=color self.money=money car=Car('奔驰','黑色','20万')# self 自动指向carprint(f"car.name ={car.name}, car.color ={car.color}, car.money ={car.money}")# 输出结果: car.name = 奔驰, car.color = 黑色, car.money = 20万self的含义:
self代表的是当前实例对象本身- 调用时不用手动传参,Python自动传递
1.4 方法
- 实例方法(最常用)
classCar:def__init__(self,name,color,money):self.name=name self.color=color self.money=moneydefspeed(self):''' 实例方法: 汽车加速 :return: '''print("汽车加速")defget_info(self):returnf"名称:{self.name}, 颜色:{self.color}, 价格:{self.money}"car=Car('奔驰','黑色','20万')car.speed()# 输出结果:汽车加速car_info=car.get_info()print(f"当前汽车的详细信息为:{car_info}")# 输出结果:当前汽车的详细信息为:名称:奔驰, 颜色:黑色, 价格:20万- 带参数的方法
classCar:def__init__(self,name,color,money):self.name=name self.color=color self.money=moneydefrun(self,distance):''' 实例方法: 汽车跑了多少米 :return: 一个结果字符串 '''returnf"汽车跑了了{distance}米"car=Car('奔驰','黑色','20万')# 关键字传参car_distance=car.run(distance=100)print(car_distance)# 汽车跑了了100米1.5 类属性和类方法
- 类属性(所有对象共享)
classCar:# 类属性type_name="汽车"def__init__(self,brand,model):# 实例属性self.brand=brand self.model=model# 通过类访问类属性print(Car.type_name)# 输出结果:汽车# 通过实例也可以读取类属性my_car=Car("吉利","星越")print(my_car.type_name)# 输出结果:汽车# 修改类属性,所有的对象都改变my_car.type_name="小汽车"print(my_car.type_name)# 输出结果:小汽车- 类方法(使用 @classmethod)
classCar:type_name="汽车"total_cars=0def__init__(self,name,color,money):self.name=name self.color=color self.money=money Car.total_cars+=1@classmethoddefget_total(cls):"""类方法:获取创建的车的总数"""returnf"总共有{cls.total_cars}辆车"@classmethoddefchange_type_name(cls,new_type_name):"""类方法:修改类属性"""cls.type_name=new_type_name car1=Car("宝马","黑色","21万")car2=Car("宝马","白色","25万")print(Car.get_total())# 总共有2辆车Car.change_type_name("越野车")print(Car.type_name)# 越野车- 静态方法(使用
@staticmethod)
classMathUtils:@staticmethoddefadd(a,b):"""静态方法:不需要 self 或者 cls"""returna+bprint(MathUtils.add(1,2))# 31.6 访问控制(封装)
Python通过命名约定来控制访问权限
classPerson:def__init__(self,name,age):self.name=name# 公共属性(可以直接访问)self._age=age# 受保护的(建议不要直接访问)self.__money=10# 私有属性(名称修饰,不能直接访问)defget_money(self):"""通过方法来访问私有属性"""returnself.__moneydefset_money(self,money):"""通过方法修改私有属性(可以添加验证)"""if(money>0):self.__money=moneyelse:self.__money=0p=Person("张三",25)print(p.name)# 可以直接访问print(p._age)# 可以直接访问,但是不建议# print(p.__money) # 出现报错 AttributeErrorprint(p.get_money())# 10 通过方法进行访问p.set_money(100)# 修改私有方法print(p.get_money())# 100总结:
| 命名方式 | 访问级别 | 示例 |
|---|---|---|
name | 公共(可访问) | self.name |
_name | 受保护的(约定,不建议访问) | self._age |
__name | 私有(不能直接访问) | self.__money |
1.7 常用的特殊方法
classDog:def__init__(self,name,age):self.name=name self.age=agedef__str__(self):"""字符串表示(print时调用)"""returnf"狗:{self.name},{self.age}岁"def__repr__(self):"""交互式环境显示"""returnf"Dog('{self.name}',{self.age})"def__len__(self):"""返回长度(len()时调用)"""returnself.agedef__add__(self,other):"""加法运算(+)"""returnDog(self.name+other.name,self.age+other.age)dog=Dog("旺财",3)print(dog)# 狗: 旺财, 3岁(调用 __str__)print(len(dog))# 3(调用 __len__)dog2=Dog("小黑",2)dog3=dog+dog2# 调用 __add__print(dog3.name)# 旺财小黑