当前位置: 首页 > news >正文

面向对象编程基础语法

面向对象编程(OOP)是 Python 的核心特性之一,它提供了一种组织代码的强大方式,使代码更模块化、可重用且易于维护。本文将系统介绍 Python 面向对象编程的基础语法,包括类定义、对象创建、继承、多态等核心概念。

文章目录

  • 一、
  • 二、类的操作
    • 1、成员引用
    • 2、实例化
  • 三、__init()__方法
  • 四、self
    • 1、self 作为实例传参
    • 2、通过 self 在类中调用类的实例属性和实例方法
  • 五、属性
    • 1、类属性
    • 2、实例属性
  • 六、方法
    • 1、实例方法
    • 2、类方法
    • 3、静态方法
    • 4、在类外定义方法
    • 5、特殊方法
  • 七、动态添加属性与方法
    • 1、动态给对象添加属性
    • 2、动态给类添加属性
    • 3、动态给实例添加方法
    • 4、动态给类添加方法
    • 5、动态删除属性与方法
    • 6、__slots__限制实例属性与实例方法

一、类

1、类

1.1、语法

class 类名:"""类说明文档"""类体

1.2、 案例

定义一个人的类,包含 init() 方法、eat() 方法和 drink() 方法

class Person:"""人的类"""home = "earth"def __init__(self):self.age = 0def eat(self):print("eating...")def drink(self):print("drinking...")

二、类的操作

1、成员引用

1.1、语法

类名.成员名

1.2、案例

class Person:"""人的类"""home = "earth"def __init__(self):self.age = 0def eat(self):print("eating...")def drink(self):print("drinking...")home = Person.home         # 获取一个字符串
eat_function = Person.eat  # 获取一个函数对象
doc = Person.__doc__       # 获取类的说明文档print(home)                # earth
print(eat_function)        # <function Person.eat at 0x00000232C8230F40>
print(doc)                 # 人的类

2、实例化

2.1、语法

变量名 = 类名()

2.2、案例

class Person:"""人的类"""home = "earth"def __init__(self):self.age = 0def eat(self):print("eating...")def drink(self):print("drinking...")p = Person()   # 创建一个对象
print(p.home)  # earth
print(p.age)   # 0p.eat()        # eating...
p.drink()      # drinking...

三、__init()__方法

init() 是一个特殊的方法,也被称作构造函数。init() 方法的主要作用是在创建类的对象时,对对象的属性进行初始化。当你使用类名创建一个新的对象时,Python 会自动调用 init() 方法,并将新创建的对象作为第一个参数(通常命名为 self)传递给它。

注意:

self:这是一个约定俗成的参数名,它代表类的实例对象本身。在方法内部,通过 self 可以访问和修改对象的属性__init__() 方法不是必需的。如果类中没有定义 __init__() 方法,Python 会使用默认的构造函数,该构造函数不执行任何操作__init__() 方法只能返回 None,不能返回其他值。如果尝试返回其他值,会引发 TypeError 异常
class Person:"""人的类"""home = "earth"def __init__(self, name):self.name = namep = Person("张三")  # 创建一个对象print(p.name)       # 张三

四、self

1、self 作为实例传参

self 代表类的实例自身。调用实例方法时,实例对象会作为第一个参数被传入。因此,我们调用 p.eat() 时就相当于调用了Person.eat(p)

class Person:"""人的类"""home = "earth"def __init__(self, name):self.name = namedef eat(self):print("eating...")def drink(self):print("drinking...")p = Person("张三")  # 创建一个对象
p.eat()             # eating...Person.eat(p)       # eating...

2、通过 self 在类中调用类的实例属性和实例方法

class Person:"""人的类"""home = "earth"def __init__(self, name):self.name = namedef eat(self):print("eating...")def drink(self):print("drinking...")def eat_and_drink(self):print(self.name)     # 在类中调用nameself.eat()           # 在类中调用eat()方法self.drink()         # 在类中调用drink()方法p = Person("张三")           # 创建一个对象p.eat_and_drink()

五、属性

1、类属性

也叫类变量。在类中方法外定义的属性。

1.1、通过 类名.属性名 或 实例名.属性名 访问

class Person:"""人的类"""home = "earth"  # 定义类属性print(Person.home)  # 通过类名访问类属性p1 = Person()       # 创建一个实例对象
print(p1.home)      # 通过实例名访问类属性,(如果实例没有覆盖这个类属性的值)

1.2、通过 类名.属性名 添加与修改类属性

class Person:"""人的类"""Person.home = "earth"  # 添加类属性
print(Person.home)  # earthPerson.home = "mars"  # 修改类属性
print(Person.home)  # mars

若使用 实例名.属性名 则会创建或修改实例属性,因此不建议类属性和实例属性同名

class Person:"""人的类"""home = "earth"p1 = Person()
p2 = Person()
print(Person.home)  # earth
print(p1.home)      # earth
print(p2.home)      # earthprint("通过 类名.属性名 修改 类属性")
Person.home = "mars"
print(Person.home)  # mars
print(p1.home)      # mars
print(p2.home)      # marsprint("通过 实例名.属性名 会创建 实例属性")
p1.home = "venus"
print(Person.home)  # mars
print(p1.home)      # venus
print(p2.home)      # mars

1.3、所有该类的实例共享同一个类属性

class Person:"""人的类"""home = "earth"   # 定义类属性,所有实例共享p1 = Person()        # 创建一个实例对象
p2 = Person()        # 创建另一个实例对象print(p1.home)       # earth
print(p2.home)       # earthPerson.home = "mars" # 修改类属性
print(p1.home)       # mars
print(p2.home)       # mars

2、实例属性

也叫实例变量。在类__init__方法中定义的属性。通过 self.属性名定义。

2.1、通过 类名.属性名 或 实例名.属性名 访问

class Person:"""人的类"""def __init__(self, name, age):self.name = name   # 定义实例属性self.age = age     # 定义实例属性p1 = Person("张三", 18)    # 创建一个实例对象
print(p1.name, p1.age)     # 张三 18p2 = Person("李四", 81)    # 创建一个实例对象
print(p2.name, p2.age)     # 李四 81print(Person.name)         # 报错

2.2、通过 实例名.属性名 添加与修改实例属性

class Person:"""人的类"""passp1 = Person()           # 创建一个实例对象
p1.name = "张三"        # 添加实例属性
p1.age = 18             # 添加实例属性
print(p1.name, p1.age)  # 张三 18p1.age = 25             # 修改实例属性
print(p1.name, p1.age)  # 张三 25

2.3、每个实例独有一份实例属性

class Person:"""人的类"""def __init__(self, name):self.name = name  # 定义实例属性self.age = 0      # 定义实例属性p1 = Person("张三")       # 创建一个实例对象
print(p1.name, p1.age)    # 张三 0p1.age = 18               # 修改p1的age属性
print(p1.name, p1.age)    # 张三 18p2 = Person("李四")       # 创建另一个实例对象
print(p2.name, p2.age)    # 李四 0

六、方法

Python的类中有三种方法:实例方法、静态方法、类方法。

1、实例方法

实例方法在类中定义,第一个参数为self,代表实例本身。实例方法只能被实例对象调用。可以访问实例属性、类属性、类方法。
class Person:"""人的类"""home = "earth"def __init__(self, name):self.name = namedef instance_method(self):print(self.name, self.home, Person.home)p = Person("张三")
p.instance_method()           # 张三 earth earth,此时p中没有home实例属性,会去查找home类属性Person.home = "venus"         # 修改类属性
p.home = "mars"               # 定义实例属性
p.instance_method()           # 张三 mars venus

2、类方法

类方法在类中通过 @classmethod 定义,第一个参数为cls,代表类本身。类方法可以被类和实例对象调用。可以访问类属性。在不创建实例的情况下调用,通过类名直接调用,非常方便,适合一些和类整体相关的操作。
class Person:"""人的类"""home = "earth"  # 定义类属性@classmethoddef class_method(cls):print(cls.home)Person.class_method()  # 通过类调用类方法p1 = Person()          # 创建一个实例对象
p1.class_method()      # 通过实例对象调用类方法

3、静态方法

静态方法在类中通过 @staticmethod 定义不访问实例属性或类属性,只依赖于传入的参数可以通过类名或实例调用,但它不会访问类或实例的内部信息,更像是一个工具函数,只是为了方便组织代码,把它放在了类里面。
class Person:"""人的类"""home = "earth"  # 定义类属性@staticmethoddef static_method():print("static method")Person.static_method()  # 通过类调用静态方法p1 = Person()           # 创建一个实例对象
p1.static_method()      # 通过实例对象调用静态方法

4、特殊方法

方法名中有两个前缀下划线和两个后缀下划线的方法为特殊方法,也叫魔法方法。上文提到的 init() 就是一个特殊方法。这些方法会在进行特定的操作时自动被调用。

4.1、 new():对象实例化时第一个调用的方法。

4.2、 init():类的初始化方法。

4.3、 del():对象的销毁器,定义了当对象被垃圾回收时的行为。使用 del xxx 时不会主动调用

4.4、str():定义了对类的实例调用 str() 时的行为。

4.5、repr():定义对类的实例调用 repr() 时的行为。 str()repr() 最主要的差别在于目标用户。 repr() 的作用是产生机器可读的输出(大部分情况下,其输出可以作为有效的Python代

七、动态添加属性与方法

1、动态给对象添加属性

class Person:def __init__(self, name=None):self.name = namep = Person("张三")
print(p.name)  # 张三p.age = 18
print(p.age)  # 18

2、动态给对象添加方法

2.1、添加普通方法

class Person:def __init__(self, name=None):self.name = namedef eat():print("吃饭")p = Person("张三")p.eat = eat # 添加普通方法
p.eat()     # 调用,吃饭

2.2、****添加实例方法

给对象添加的实例方法只绑定在当前对象上,不对其他对象生效,而且需要传入 self 参数。需要使用 types.MethodType(方法名,实例对象) 来添加实例方法。

import typesclass Person:def __init__(self, name=None):self.name = namedef eat(self):print(f"{self.name}在吃饭")p = Person("张三")
p.eat = types.MethodType(eat, p)
p.eat()  # 张三在吃饭

3、动态给类添加属性

class Person:def __init__(self, name=None):self.name = namep = Person("张三")
print(p.name)       # 张三Person.age = 0      # 给类添加属性
print(p.age)        # 0

4、动态给类添加方法

给类添加的方法对它的所有对象都生效,添加类方法需要传入 cls 参数,添加静态方法则不需要

class Person:home = "earth"def __init__(self, name=None):self.name = name# 定义类方法
@classmethod
def come_from(cls):print(f"来自{cls.home}")# 定义静态方法
@staticmethod
def static_function():print("static function")Person.come_from = come_from
Person.come_from()                         # 来自earthPerson.static_function = static_function
Person.static_function()                   # static function

5、动态删除属性与方法

5.1、****del 对象.属性名

5.2、****delattr(对象,属性名)

6、__slots__限制实例属性与实例方法

Python允许在定义类的时候,定义一个特殊的 slots 变量,来限制该类的实例能添加的属性。使用 slots 可以限制添加实例属性和实例方法,但类属性、类方法和静态方法还可以添加。slots仅对当前类生效,对其子类无效。

import typesclass Person:__slots__ = ("name", "age", "eat")def __init__(self, name=None):self.name = namedef eat(self):print(f"{self.name}在吃饭")def drink(self):print(f"{self.name}在喝水")p = Person("张三")# 添加实例属性
p.age = 10
print(p.age)  # 10# 添加实例方法
p.eat = types.MethodType(eat, p)
p.eat()  # 张三在吃饭# 添加实例属性
p.weight = 100  # AttributeError: 'Person' object has no attribute 'weight'# 添加实例方法
p.drink = type.MethodType(drink, p)  # AttributeError: type object 'type' has no attribute 'MethodType'
http://www.jsqmd.com/news/1335509/

相关文章:

  • union 实现char转float GPS精度不丢失
  • 扣子消息触发器性能瓶颈诊断:从延迟飙升到毫秒级响应的7步调优全链路
  • 2026年上海木托盘/栈板厂家**:源头定制实力与耐用承重口碑精选 - 优企名品
  • 3分钟学会在Mac上制作Windows启动盘:WinDiskWriter让复杂操作变简单
  • 深入解析操作系统进程:从概念到实践的核心指南
  • 鸣潮模组终极指南:如何用WuWa-Mod解锁无限游戏乐趣
  • GoogleSignIn-iOS高级功能:App Attest与多平台支持实战
  • 鼠须管输入法:在macOS上打造你的专属中文输入体验终极指南
  • 程序员要有底线 别被西方零和博弈思维绑架 反投毒宣言
  • 2026年上海木托盘厂家实力甄选:燕胜包装科技(上海)有限公司——源头定制与出口免熏蒸托盘的专业供应企业 - 优企名品
  • 直流电机模糊控制MATLAB仿真:从非线性系统建模到鲁棒性验证
  • 2026年上海闵行区GEO优化服务商代理加盟选型指南|闵行GEO代理服务商选择哪家靠谱? - 子柔传媒
  • 惠州情感挽回咨询哪家好:【谋仕心理】梳理心绪 - 18102756859
  • 什么是重组蛋白?|重组蛋白表达原理、表达系统及应用全面解析
  • 2026年南京庭院设计哪家强?业主真实居住体验说出真相
  • WebExtensions命令系统:快捷键与contextMenus API提升用户体验
  • 嵌入式开发实战:IAR环境搭建、工程配置与调试全解析
  • 英雄联盟智能助手Seraphine:让数据成为你的最强队友
  • 白番茄面膜推荐:【蜜妙诗】雪颜珍藏 - 17328623207
  • 汕头招聘平台哪个好:【帅聘网】口碑 - 18002239949
  • 2026.8.5
  • 济南IATF16949认证咨询哪家靠谱?行业套路揭秘+合规筛选标准汇总 - 互联网科技品牌测评
  • C++拷贝构造函数值传递陷阱:从递归崩溃到正确实现
  • 3分钟彻底告别插件下载等待:HACS极速版终极指南
  • linux/windows共享文件夹
  • 椰林海鲜码头味道正宗吗? - 17728181569
  • 计算机毕业设计之多渠道抄表管理系统
  • 解锁视觉新维度:nunif如何将普通2D视频变成沉浸式3D体验
  • 基本权利不容侵犯:任何人与组织都不应自视为上帝
  • 无人机避障算法 —— EGO-Planner —— EGO-Planner膨胀系数的大小对无人机避障飞行的影响