这是我参与更文挑战的第 26 天,活动详情查看: 更文挑战
1. 概述
Python 对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊的用法。
常见的特殊属性有如下:
| 特殊方法 | 含义 |
|---|---|
obj.__dict__ | 对象的属性字典 |
obj.__class__ | 对象所属的类 |
class.__bases__ | 类的基类元组(多继承) |
class.__base__ | 类的基类 |
class.__mro__ | 类层次结构 |
class.__subclasses__() | 子类列表 |
如果时间空余,大家可以看看Python内部特殊属性及特殊方法说明
2. 实操__dict__
在Python内部创建一个类,类里面包含的类属性和类实例属性在堆内存内部都是以字典的形式进行存储的,其属性名作为键,值作为键对应的值。
类名.__dict__()会输出包含类中所有的类属性的信息的字典类实例对象.__dict__()会输出包含实例对象的属性信息的字典- 类实例对象可以通过字典的形式修改属性值
实例对象.__dict__[属性名]="新的属性值"
class Animal:
zone = "Aisa" # 类属性
time = "2021" # 类属性
def __init__(self,name,food): # 实例属性特征
self.name = name
self.food = food
#通过类名调用__dict__查看Animal所有的类属性
print("Animal类属性为:",Animal.__dict__)
Cat = Animal("Tome","fish")
#通过实例对象调用__dict__,查看实例对象的属性
print("实例对象Cat 属性为:",Cat.__dict__)
Cat.__dict__["name"]= "JueJing"
print("实例对象Cat通过属性名name来修改属性值:",Cat.name)
3. 实操__class__
Python提供了类实例对象查询所属的类相关信息
使用形式为:对象名.__class__
class Animal:
pass
class Fish(Animal):
pass
fish =Fish() #创建Fish的实例对象fish
print(fish.__class__) #实例对象fish查询所属对象
4. 实操__mro__
Python 支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将“从左向右”按顺序搜索
MRO(Method Resolution Order): 方法解析顺序。我们可以通过mro()或者方法获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找的。
使用形式有两种格式如下:
类名.__mro__类名.mro()
#多重继承
class A:
def aa(self):
print("aa")
def say(self):
print("say AAAA")
class B:
def bb(self):
print("bb")
def say(self):
print("say BBB")
class C(B:A):
def cc(self):
print("cc")
c = C()
print(C.mro()) #打印类的层次结构
c.say() #解释器寻找方法是从左到右的方式寻找B类中的say()
5. 实操__bases/base__
Python内部提供子类查询相关的父类查询
__bases__适用于多继承。查询相关父类信息,并返回元组形式的结果__base__查询父类__subclass__查询子类列表
class Animal:
pass
class Mammal():
pass
class Dog(Mammal,Animal):
pass
class Fish(Animal):
pass
print(Dog.__bases__) # 查询多继承父类信息
print(Dog.__base__) # 查询从左到右最接近的父类信息Manmal
print(Animal.__subclasses__()) #查询子类列表
总结
本期我们学习Python内部以双下划线开头和结尾的特殊属性,我们可以通过这些方法,我们能查询和类相关的属性,以及父类和子类继承的结构。
我们上期学习与特殊属性一样的特殊方法,欢迎大家回顾学习
好啦,以上是本期内容,欢迎大佬们评论区指正,下次见~