Python特殊属性

510 阅读3分钟

这是我参与更文挑战的第 26 天,活动详情查看: 更文挑战

1. 概述

Python 对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊的用法。

常见的特殊属性有如下:

特殊方法含义
obj.__dict__对象的属性字典
obj.__class__对象所属的类
class.__bases__类的基类元组(多继承)
class.__base__类的基类
class.__mro__类层次结构
class.__subclasses__()子类列表

如果时间空余,大家可以看看Python内部特殊属性及特殊方法说明

builtins文件

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)

__dict__运行结果

3. 实操__class__

Python提供了类实例对象查询所属的类相关信息

使用形式为:对象名.__class__

class Animal:

    pass

class Fish(Animal):

    pass

fish =Fish()   #创建Fish的实例对象fish
print(fish.__class__)   #实例对象fish查询所属对象

class运算结果

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()

mro()运算结果

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内部以双下划线开头和结尾的特殊属性,我们可以通过这些方法,我们能查询和类相关的属性,以及父类和子类继承的结构。

我们上期学习与特殊属性一样的特殊方法,欢迎大家回顾学习

好啦,以上是本期内容,欢迎大佬们评论区指正,下次见~