[Advanced Python] OOP
黑马程序员:Python面向对象
封装、继承和多态
一、Encapsulation
-
类的自我介绍
<class name>.__doc__ def __str__(self)
-
__del__ 与 生命周期
也属于 双下划线,所以也是“privite”。
__init__ __del__
del <object name>
-
is, is not 身份运算符
完全一样,包括地址 id()。
二、Inheritance
派生类 Derived class,就是子类。
-
子类调用父类方法
Overwrite 后,如何依旧调用父类方法?
好处:super() 等价 Dog这个类,并且不再需要self这个参数。
如果用成了对象,小心递归调用:XiaoTianQuan.bark(self)
class XiaoTianQuan(Dog): def fly(self): print("fly") def bark(self): # 1. own feature print("wow wangwang") # 2. common bark # super().bark() # py3 Dog.bark(self) # py2
-
多继承 __mro__
Method Resolution Order (MRO)
显示调用顺序。
c = C() c.test() c.demo() print(C.__mro__) Output: (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
-
新式类 pk 旧式类
可见,已经默认都继承了 object,都是新式类。
旧式只显示__doc__,__module__。

$ python3 Python 3.6.9 (default, Oct 8 2020, 12:12:24) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> >>> class A(object): ... pass ... >>> a = A() >>> dir(a) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] >>> >>> class B: ... pass ... >>> b = B() >>> dir(b) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
三、polymorphism
class 上帝 与人类玩耍,可能与程序员 or 设计师。
上帝只会使用 比较通用的 人类methods。
game_with_dog(),参数是一个父类,实际上可能代表子类。
wangcai = XiaoTianQuan("feitian wangcai") xiaoming = Person("xiao ming") # here, xiao ming never know what kind of doy it will be. # But it should a dog. # So, we use polymorphism here. xiaoming.game_with_dog(wangcai)
属性和方法
一、类属性
类,是一个特殊的对象 --> 类对象。
创建出的对象叫做 --> 实例对象。
-
单例
类属性,可用于记录:“创建了多少个工具对象” --> 单例模式实现。
[应用场景]:音乐播放对象、回收站对象、打印机对象。
__new__ 是基类提供的“静态方法”,为对象分配空间。 --> __init__ 对象初始化。
实现单例,需要重写__new__方法:
class MusicPlayer(object): # 类属性 instance = None init_flag = False def __new__(cls, *args, **kwargs): # 有cls的静态方法,因为是空间分配,自然与“类属性和对象属性”没有关系,便属于了静态方法。 if cls.instance is None: print("new a space.") cls.instance = super().__new__(cls) return cls.instance def __init__(self): if MusicPlayer.init_flag: return print("init player") MusicPlayer.init_flag = True player = MusicPlayer() player2 = MusicPlayer() print(player) print(player2)
-
<实例对象>.类方法 de 歧义
类属性,向上查找机制。(1) 实例对象中有么?(2) 类对象中有么?
但,不要使用 <实例对象>.类方法
<实例对象>.类方法 = 99,赋值后,会带来歧义!
导致 类方法和对象方法是同样的名字。
二、类方法
例如,针对 "类属性" 的方法设计。
三、静态方法
什么情况下考虑使用?
(1) 既不访问 实例属性
(2) 也不访问 类属性
(3) 创建类的特殊时期
class Dog(object): @staticmethod def run(): print("running...") # 比较独立的一个方法,没有操作 实例属性 or 类属性 Dog.run()
四、确定方法类型的套路
一个示范案例 Game类:
问:如果类属性和实例属性都要访问到呢?
答:实例方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律