[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__']
View Code
复制代码

 

三、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类:

 

问:如果类属性和实例属性都要访问到呢?

答:实例方法。

 

 

posted @   郝壹贰叁  阅读(87)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示