4.5 object类
🚩object类是所有类的父类,因此所有类都有object类的属性和方法。
class Student: # 默认继承 object 类 pass class Teacher(): # 默认继承 object 类 pass class headmaster(object): pass
内置函数dir()可以查看指定对象所有属性
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 9:02 # 欢迎大家关注AIoT相关博客~ class Student: # 默认继承 object 类 pass stu = Student() print(dir(stu))
我们可以看到 object 类中其实有很多的属性以及方法,我们在之前其实已经介绍过了 __init__() 方法,这里我们介绍一下 object 中的 __str__() 方法,其他的方法和属性我们会在 4.7 特殊属性,4.8 特殊方法 中介绍。__str__() 方法用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮我们查看对象的信息,所以我们经常会对 __str__() 进行重写,不重写 __str__() 方法输出的其实是对象的内存地址。
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 9:02 # 欢迎大家关注AIoT相关博客~ class Student: # 默认继承 object 类 pass stu = Student() print(stu.__str__())
接下来我们去重写这个方法返回我们要的信息:
❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 9:02 # 欢迎大家关注AIoT相关博客~ class Student: # 默认继承 object 类 def __init__(self, name, age): self.name = name self.age = age def __str__(self): return '你好,我是{0},今年{1}岁'.format(self.name, self.age) stu = Student('辰chen', 19) print(stu.__str__())
这里额外补充一下:直接输出对象名的形式其实就是默认调用 __str__()
方法:
❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 9:02 # 欢迎大家关注AIoT相关博客~ class Student: # 默认继承 object 类 def __init__(self, name, age): self.name = name self.age = age def __str__(self): return '你好,我是{0},今年{1}岁'.format(self.name, self.age) stu = Student('辰chen', 19) print(stu)
4.6 多态的实现
🚩简单地说,多态就是“具有多种形态”,它指的是:即便不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调用哪个对象中的方法。
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 9:38 # 欢迎大家关注AIoT相关博客~ class Animal: def eat(self): print('动物会吃东西') class Dog(Animal): def eat(self): print('狗会吃骨头') class Cat(Animal): def eat(self): print('猫会吃鱼') class Person: def eat(self): print('人会吃五谷杂粮') # 类之外定义函数: def fun(obj): obj.eat() # 在调用 fun() 函数的时候,我们只关心传入的类是否具有 eat() 方法,而并不关心类之间的关系。 fun(Dog()) fun(Cat()) fun(Animal()) fun(Person())
静态语言与动态语言
静态语言实现多态的三个必要条件:
1.继承
2.方法重写
3.父类引用指向子类对象
动态语言的多态崇尚“鸭子类型”当看到一只鸟走起来像鸭子、游泳起来像鸭子、收起来也像鸭子,那么这只鸟就可以被称为鸭子。在鸭子类型中,不需要关心对象是什么类型,到底是不是鸭子,只关心对象的行为。
Python 就是动态语言,而 Java 就是静态语言
4.7 特殊属性
🚩部分特殊属性:
名称 | 描述 |
__dict__ | 获得类对象或实例对象所绑定的所有属性和方法的字典序列 |
__class__ | 获取对象所属的类 |
__bases__ | 获取类的父类的元组序列 |
__base__ | 获取类的基类(继承的第一个父类) |
__mro__ | 获取类的层次结构 |
__subclasses__ | 获取子类的列表序列 |
这里直接用代码去演示,具体实现看备注和运行结果即可:
❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 10:48 # 欢迎大家关注AIoT相关博客~ #print(dir(object)) class A: pass class B: pass class C(A,B): def __init__(self, name,age): self.name = name self.age = age class D(A): pass #创建C类的对象 x = C('辰chen', 19) # x是C类型的一个实例对象 print(x.__dict__) # 实例对象的属性字典 print(C.__dict__) # 类的属性字典 print('-----------------------------') print(x.__class__) # <class '__main__.C'> 输出了对象所属的类 print(C.__bases__) # C类的父类类型的元组 print(C.__base__) # 类的基类(哪个父类离得最近就输出哪个父类) print(C.__mro__) # 类的层次结构 print(A.__subclasses__()) # 子类的列表
4.8 特殊方法
🚩部分特殊方法:
名称 | 描述 |
__len__() | 通过重写__len__()方法,让内置函数len()的参数可以是自定义类型 |
__add__() | 通过重写__add__()方法,可使用自定义对象具有“+”功能 |
__new__() | 用于创建对象 |
__init__() | 对创建的对象进行初始化 |
__len__() | 通过重写__len__()方法,让内置函数len()的参数可以是自定义类型 |
这里直接用代码去演示,具体实现看备注和运行结果即可:(__new__(),__init__() 会在下一小节中进行讲解)
❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 11:10 # 欢迎大家关注AIoT相关博客~ a, b = 10, 20 c = a + b # 两个整数类型的对象的相加操作 d = a.__add__(b) # '+'的底层实现 print(c) print(d) class Student: def __init__(self,name): self.name=name def __add__(self, other): return self.name+other.name def __len__(self): return len(self.name) stu1=Student('辰chen') stu2=Student('枭哥') s = stu1 + stu2 #实现了两个对象的加法运算(因为在Student类中 编写__add__()特殊的方法) print(s) s = stu1.__add__(stu2) print(s) print('----------------------------------------') lst = [1, 2, 3, 4] print(len(lst)) # 调用内置函数 len() 计算列表的长度 print(lst.__len__()) print(len(stu1)) # 返回的是 stu1 的 name 长度