Python - 面向对象编程 - __dict__

简介: Python - 面向对象编程 - __dict__

为什么要讲 __dict__


  • 在 Python 类的内部,无论是类属性、实例属性、实例方法、类方法、静态方法,都是以字典的形式进行存储的,其中属性名作为键,而值作为该键对应的值
  • 为了方便查看类包含了哪些属性、方法,就可以使用类提供的 __dict__ 属性,记住是一个属性,不是方法来的

 

单继承的栗子


class PoloBlog:
    sum = 0
    def __init__(self, name):
        self.name = name
    def test(self):
        pass
    @classmethod
    def test_cls(cls):
        pass
    @staticmethod
    def test_static():
        pass
blog = PoloBlog("小菠萝")
blog.test()
# 实例对象调用
print(blog.__dict__)
# 类对象调用
print(PoloBlog.__dict__)
# 输出结果
{'name': '小菠萝'}
{'__module__': '__main__', 'sum': 0, '__init__': <function PoloBlog.__init__ at 0x105d2b0d0>, 'test': <function PoloBlog.test at 0x105d4d310>, 'test_cls': <classmethod object at 0x105c47fa0>, 'test_static': <staticmethod object at 0x105c47d90>, '__dict__': <attribute '__dict__' of 'PoloBlog' objects>, '__weakref__': <attribute '__weakref__' of 'PoloBlog' objects>, '__doc__': None}


  • 如果用实例对象调用 __dict__ 会输出所有实例属性组成的字典
  • 类对象调用 __dict__ 会输出所有实例方法、类属性、类方法组成的字典

 

多继承的栗子


class A:
    a = 0
    def __init__(self):
        self.name = "小菠萝"
        pass
    def test(self):
        pass
class B(A):
    b = 0
    def __init__(self):
        super(B, self).__init__()
        self.age = 24
# 通过类对象调用
print(A.__dict__)
print(B.__dict__)
# 通过实例对象调用
a = A()
b = B()
print(a.__dict__)
print(b.__dict__)
# 输出结果
{'__module__': '__main__', 'a': 0, '__init__': <function A.__init__ at 0x1022553a0>, 'test': <function A.test at 0x102255430>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
{'__module__': '__main__', 'b': 0, '__init__': <function B.__init__ at 0x1022554c0>, '__doc__': None}
{'name': '小菠萝'}
{'name': '小菠萝', 'age': 24}


父类有自己的 __dict__,同样子类也有自己的 __dict__,它不会包含父类的 __dict__

 

通过 __dict__ 修改值


还是上面的代码

a = A()
print(a.__dict__)
# 修改属性值
a.__dict__["name"] = "新的小菠萝"
print(a.__dict__)
# 输出结果
{'name': '小菠萝'}
{'name': '新的小菠萝'}
相关文章
|
4天前
|
Python
python基础篇:面向对象编程
python基础篇:面向对象编程
21 0
|
4天前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
4天前
|
Python
Python中的面向对象
【5月更文挑战第4天】面向对象编程(OOP)是Python的核心,涉及类与对象、封装、继承和多态。类是对象的模板,对象则是类的实例。例如,`Person`类有`__init__`构造方法和`greet`方法。
15 3
|
4天前
|
算法 Java 程序员
[重学Python] Day6 面向对象编程 基础
面向对象编程基础讲解,包括类与对象的概念,类是对象的模板,对象是类的实例。Python中使用`class`定义类,通过`__init__`初始化对象。创建对象并调用方法如`drive`和`target_client`。访问权限在Python中相对宽松,使用单下划线表示受保护的属性。面向对象的三大支柱是封装、继承和多态,封装是隐藏实现细节,仅暴露简单接口。提供了数字时钟和平面上的点的类定义作为练习示例。
14 0
|
4天前
|
算法 Python
Python面向对象oop编程(二)
Python面向对象oop编程(二)
|
4天前
|
运维 算法 Shell
第六章 Python类(面向对象编程)
第六章 Python类(面向对象编程)
|
4天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
4天前
|
设计模式 算法 程序员
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
|
4天前
|
数据安全/隐私保护 Python
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义
|
4天前
|
数据安全/隐私保护 Python
python基础之面向对象
面向对象编程(OOP)是一种以对象为中心的编程范式,通过对象和类实现现实世界的抽象。对象是程序的基本单元,类是对象的模板。主要特点包括:封装,通过访问修饰符隐藏对象内部细节,保证数据安全;继承,子类继承父类属性和方法,实现代码复用;多态,同方法调用在不同对象上产生不同行为,增强灵活性。示例代码展示了Python中的类定义、封装、继承和多态概念。