1【python】:Python的面向对象编程OOP

📅 2026/8/14 1:52:55
1【python】:Python的面向对象编程OOP
1.类class一组具有相同属性和方法的对象的抽象描述。类本身不占内存它只是蓝图 为什么会有类这个东西你想想看你平时怎么描述一个东西比如你要描述手机它有品牌、颜色、内存大小它能打电话、能拍照、能上网手机这个类别不是具体某部手机这就是类描述一类东西的共同特征和共同能力。2.对象根据类创建出来的具体实体占用内存。对象包含具体的属性值数据和可执行的方法行为。你手里那部具体的苹果手机3.属性实例变量类变量属性就是挂在对象或类身上的变量。它是用来存储数据的不是用来执行代码的。概念属性类型属于谁访问方式实例变量实例属性属于对象每个对象各有一份self.xxx或对象.xxx类变量类属性属于类所有对象共享一份cls.xxx或类名.xxx这部手机的数据品牌苹果颜色黑色内存256Gclass Dog: species 犬科 def __init__(self, name): self.name name d1 Dog(旺财) d2 Dog(小黑) #输出犬科 犬科 注意区分类变量和实例变量4.方法类中定义的函数。方法类型谁调用第一个参数能访问什么生活类比实例方法对象self对象自己能访问实例属性也能访问类属性“张三你的学号是多少”问的是具体某个学生类方法类 或 对象cls类自己只能访问类属性不能访问实例属性“这所学校一共有多少学生”问的是整个学校静态方法类 或 对象没有特殊参数什么都访问不了就是个普通函数“计算两个数的平均数”和具体学生、学校都无关只是个工具这部手机的功能能打电话能拍照5.⭐继承即一个派生类derived class继承基类base class的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如有这样一个设计一个Dog类型的对象派生自Animal类这是模拟是一个is-a关系例图Dog是一个Animal。继承 儿子继承父亲父亲有的儿子都有。子类可以自动拥有父类的所有属性和方法不需要重新写一遍。class Animal: def __init__(self, name): self.name name def eat(self): print(f{self.name} 在吃东西) class Cat(Animal): def __init__(self, name, color): super().__init__(name) # 先调用父类的 __init__ self.color color # 自己的属性 def meow(self): print(f{self.name} 喵喵叫) c Cat(小花, 橘色) print(c.name) # 小花 ← 从父类继承来的 print(c.color) # 橘色 ← 自己的 c.eat() # 小花 在吃东西 ← 从父类继承来的 c.meow() # 小花 喵喵叫 ← 自己的6.⭐封装封装是指将对象的数据属性和操作数据的方法行为捆绑在一起形成一个独立的单元即对象并尽可能隐藏对象的内部实现细节只对外暴露必要的接口供外部访问。封装的两个核心动作✅ 封装藏起来开窗口动作做法目的代码角色隐藏数据用__把属性变成私有的外部不能直接访问self.__money 100藏起来暴露接口提供公开的方法getter/setter外部通过方法间接操作可以加校验逻辑def get_money(self):def add_money(self,amount):开窗口允许看开窗口允许改class Person: def __init__(self): self.__money 100 p Person() print(p.__money) # ← 这一行报错 #__money 前面有两条下划线Python 说“这是私有的外面不许看”。所以 print(p.__money) 会报错。这就是封装 用 __ 开头把属性藏起来外面访问不到。 #那外面想看到钱怎么办 class Person: def __init__(self): self.__money 100 def get_money(self): return self.__money p Person() print(p.get_money()) # 100 #你通过 get_money() 这个“窗口”来看钱而不是直接看 __money。 #那外面想改钱怎么办 class Person: def __init__(self): self.__money 100 def add_money(self, amount): self.__money self.__money amount p Person() p.add_money(50) print(p.get_money()) # 150 #想改钱只能用 add_money() 这个“窗口”来改不能直接改 __money。7.⭐多态多态是指同一个方法名在不同类中有不同的实现。当调用这个方法时程序会根据对象的实际类型自动执行对应类中的方法。多态最大的好处是你可以统一处理不同的对象不用关心它们具体是什么类型。class Cat: def speak(self): print(喵喵喵) class Dog: def speak(self): print(汪汪汪) class Duck: def speak(self): print(嘎嘎嘎)8.运算符重载运算符重载就是在类里定义特殊方法如__add__、__str__Python 会在特定时机自动调用这些方法你只需要在方法里写怎么做。从而实现让、-、*这些运算符能用在你自己定义的类上。#先看python已经帮你做的 print(3 5) # 两个数字相加 8 print(Hello World) # 两个字符串相加 HelloWorld print([1, 2] [3, 4]) # 两个列表相加 [1, 2, 3, 4] #同一个 号对不同类型做了不同的事。这其实就是多态的一种体现。 #❌ 但自定义类不支持 class Vector: def __init__(self, x, y): self.x x self.y y v1 Vector(1, 2) v2 Vector(3, 4) # v3 v1 v2 # ❌ 报错不支持 为什么报错 Python 不知道 对 Vector 应该怎么操作。 #✅ 运算符重载就是告诉 Python当 作用于我的类时按我指定的方式做 class Vector: def __init__(self, x, y): self.x x self.y y def __add__(self, other): return Vector(self.x other.x, self.y other.y) # 定义 的行为x 加 xy 加 y v1 Vector(1, 2) v2 Vector(3, 4) v3 v1 v2 #现在能用了 Python 看到 v1 v2会去调用 v1 的 __add__ 方法把 v2 传进去。 print(v3.x) # 4 print(v3.y) # 6特殊方法对应表运算符特殊方法说明__add__加法-__sub__减法*__mul__乘法/__truediv__除法%__mod__取余**__pow__幂运算__eq__等于比较__lt__小于比较__gt__大于比较len()__len__获取长度print()__str__字符串表示obj[index]__getitem__索引取值obj[index] value__setitem__索引赋值