Python 类中,凡是以双下划线 "__" 开头和结尾命名的成员(属性和方法),这些特殊成员存在着一些特殊含义,都被称为类的特殊成员(特殊属性和特殊方法)。

我们把特殊属性也可以称之为魔法属性,或者内置类属性。

1、魔法属性__name__

__name__是用来标识模块名字的一个系统变量。

这里分两种情况:

  • 第一种情况指的是当前运行的模块,那么当前模块__name__的值就为__main__
  • 第二种情况指的是该模块是使用import导入的模块,那么这个被导入模块的__name__变量的值为该模块的文件名(去掉.py)。

示例:

Demo1.py文件:

# 在当前文件中直接调用__name__属性
def my_func():
print("我的模块名是", __name__) # __name__属性在模块中可直接调用
# 在当期模块中调用
# 结果:我的模块名是 __main__
if __name__ == "__main__":
my_func()

Demo2.py文件:

# 导入Demo1模块,使用模块中的my_func()方法
from Demo1 import * # 执行my_func()方法
# 结果:我的模块名是 Demo1
my_func()

2、魔法属性__bases__

Python 为所有类都提供了一个__bases__属性,通过该属性可以查看该类的所有直接父类,该属性返回所有直接父类组成的元组。(直接父类)

class A(object):
pass class B(A):
pass class C(B):
pass class D(C,B,A):
pass # 类名直接调用__bases__属性
print(C.__bases__)
print(D.__bases__)
"""
输出结果:
(<class '__main__.B'>,)
(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>)
"""

注意:在类的实例对象中没有__bases__属性。

3、魔法属性__mro__

Python的每一个有父类的类,都有一个与方法解析顺序相关的特殊属性__mro__属性, 它是一个tuple(元组), 装着方法解析时的对象查找顺序,越靠前的优先级越高。

执行下面的代码:

class A(object):
pass class B(A):
pass class C(B):
pass # 类名直接调用__bases__属性
print(C.__bases__)
print(C.__mro__)
"""
输出结果:
(<class '__main__.B'>,)
(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
"""

说明:__mro__属性和__bases__属性的区别。

__bases__属性是查看当前类的直接父类,返回一个元组。

__mro__属性是指在有继承关系中,包括单继承,多重继承,多层继承中。使用super调用父类的方法和属性的时候,优先查找的顺序。

4、魔法属性__doc__

作用:表示类的描述文档信息。

class Person:
"""
这里是类的描述类信息。
""" def func(self):
"""
这里是类中方法的描述类信息。
"""
pass # 因为是属性,不用加()
print(Person.__doc__)

输出结果:

5、魔法属性__module__ __class__

__module__ 属性:表示当前操作的对象属于哪个模块。

__class__属相:表示当前操作的对象的是由哪个类创建的。

# 定义一个类
class Person(object):
pass obj = Person()
print(obj.__module__)
print(obj.__class__)
"""
输出结果:
__main__ : 表示前挡模块
<class '__main__.Person'> : 表示该对象属于当前模块中的Python类
"""

6、魔法属性__dict__

列出类中或者对象中的所有成员,以字典的形式返回。这个属性不用我们再类中覆写,类和对象默认自带。

class Person(object):

    def __init__(self, name, age):
self.name = name
self.age = age def tellMe(self):
print(f'我叫{self.name},今年{self.age}') # 获取类的所有成员
print(Person.__dict__) # # 获取对象的所有成员
obj1 = Person('美猴王', "18")
obj2 = Person('齐天大圣', "30")
print(obj1.__dict__)
print(obj2.__dict__)
"""
输出结果 : 类的所有成员:
{'__module__': '__main__',
'__init__': <function Person.__init__ at 0x0000000002425828>,
'tellMe': <function Person.tellMe at 0x0000000002425A68>,
'__dict__': <attribute '__dict__' of 'Person' objects>,
'__weakref__': <attribute '__weakref__' of 'Person' objects>,
'__doc__': None}
注意:__weakref__,和垃圾回收机制,还有弱引用的知识点有关。 对象的所有成员:
{'name': '美猴王', 'age': '18'}
{'name': '齐天大圣', 'age': '30'} """

注意:从上面的结果可以看出,对象调用__dict__属性,没有看到对象中的方法。

  • 类的实例属性属于对象,类的实例方法不属于对象。也就是说__dict__属性不打印处对象的中方法。
  • 类中的类属性和方法等都属于类。

7、魔法属性__slots__

Python是动态语言,对于普通的类,可以为类的实例对象赋值任何属性,这些属性会存储在__dict__中。

而类中定义了__slots__属性,它仅允许动态绑定__slots__里边定义的属性。

示例:

# 创建一个Student类
class Student():
# 定义__slots__
__slots__ = ('name', 'age') # 创建一个学生对象
stu = Student()
# 动态添加__slots__属性中定义的属性,可以添加
stu.name = '孙悟空'
stu.age = 18 # 而__slots__属性中没有定义的属性,是添加不了的。
# 结果:AttributeError: 'Student' object has no attribute 'addr'
stu.addr = "北京"

『无为则无心』Python面向对象 — 60、魔法属性的更多相关文章

  1. 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)

    目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...

  2. 『无为则无心』Python面向对象 — 53、对Python中封装的介绍

    目录 1.继承的概念 2.继承的好处 3.继承体验 4.单继承 5.多继承 1.继承的概念 在Python中,如果两个类存在父子级别的继承关系,子类中即便没有任何属性和方法,此时创建一个子类对象,那么 ...

  3. 『无为则无心』Python面向对象 — 45、面向对象编程

    目录 1.面向对象编程的概念 2.面向对象编程和面向过程编程的区别 (1)面向过程编程 (2)面向对象编程 3.举例理解面向对象 4.Python的面向对象编程 5.面向对象的几大核心特性 1.面向对 ...

  4. 『无为则无心』Python面向对象 — 46、类和对象

    目录 1.理解类和对象 2.类 3.对象 4.Python中的对象 5.类和对象的定义 (1)定义类 (2)创建对象 (3)练习 6.拓展:isinstance() 函数 1.理解类和对象 (1)类和 ...

  5. 『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)

    Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...

  6. 『无为则无心』Python面向对象 — 56、Python多态

    目录 1.Python中的多态 (1)多态的定义 (2)多态的好处 (3)多态实现步骤 2.体验多态 1.Python中的多态 (1)多态的定义 多态是一种使用对象的方式,子类重写父类方法,不同的子类 ...

  7. 『无为则无心』Python面向对象 — 47、Python中的self详解

    目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...

  8. 『无为则无心』Python面向对象 — 54、重写和super()函数

    目录 1.重写 2.super()函数 方式一 方式二 __mro__内置类属性说明 1.重写 在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个 ...

  9. 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员

    目录 1.Python支持多层继承 (1)多层继承实现 (2)多层继承和多重继承区别 2.继承中的私有成员 (1)继承中父类私有属性和私有方法 (2)获取和修改私有属性值 1.Python支持多层继承 ...

随机推荐

  1. 基于华为云服务器的FTP站点搭建

    前言 主要介绍了华为云上如何使用弹性云服务器的Linux实例使用vsftpd软件搭建FTP站点.vsftpd全称是"very secure FTP daemon",是一款在Linu ...

  2. ctf--web刷题记录 ACTF2020back up file 、极客大挑战2019php、secret file

    ACTF2020back up file backup file指的是备份文件,一般备份文件的后缀有".git" .".svn"." .swp&quo ...

  3. 记录一个问题:macos High Sierra 10.13.6 内核内存泄漏,导致内存满而不得不重启

    kernel_task进程占用内存10g以上,使用中突然提示内存不足,要求杀死工作进程,不得不强按电源键来关机重启. 升级之前,版本大约是macos High Sierra 10.13.4, 系统频繁 ...

  4. context包

    目录 Context包到底是干嘛用的? context原理 什么时候应该使用 Context? 如何创建 Context? 主协程通知有子协程,子协程又有多个子协程 context核心接口 empty ...

  5. 多线程(Thread类中的方法线程名称)

    1 package multithread; 2 3 /* 4 * 如何创建一个线程呢? 5 * 6 * 创建线程方式一:继承Thread类. 7 * 8 * 步骤: 9 * 1,定义一个类继承Thr ...

  6. QPS、TPS、并发用户数、吞吐量

    1.QPS QPS Queries Per Second 是每秒查询率 ,是一台服务器 每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内 所处理流量多少的衡量标准, 即每秒的响应请求数,也 ...

  7. 获取nginx日志状态码百分比脚本

    #!/bin/bash pwd=/app/nginx/logs/access.log for num1 in `cat $pwd | awk '{print $9}' | grep -Ei " ...

  8. 『无为则无心』Python基础 — 42、Python中文件的读写操作(二)

    目录 (5)文件对象方法(重点) 1)写方法 2)读方法 3)seek()方法 4)tell()方法 (6)关闭 (7)综合练习:读取大文件 (5)文件对象方法(重点) 1)写方法 @1.语法 对象对 ...

  9. 阿里智能运维实践|阿里巴巴DevOps实践指南

    编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...

  10. 合宙AIR105使用Keil MDK + DAP-Link 烧录和调试

    关于AIR105 AIR105是合宙LuatOS生态下的一款芯片, 1月初上市, 开发板与摄像头一起搭售(赠送). 从配置信息看, 芯片性能相当不错: Cortex-M4F内核, 最高频率204Mhz ...