前面有篇文章讲解了【类的特殊方法,自动调用】,现在说一下 内置特殊变量,直接使用。
我们先看一下,内置全局变量有哪些,用 vars() 函数来看
print(vars())# 返回:{'__name__': '__main__', '__doc__': '模块说明部分', '__package__': None, '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'D:/WanGeAoto/study/para_in/pkg/model.py', '__cached__': None}
我们讲一下常用的特殊变量
- __name__:类、函数、方法、描述器或生成器实例的名称
- __doc__:类、函数或模块之内的注释文档,第一个字符串
- __file__:当前模块的路径
- __cached__:编译代码(字节码文件 .pyc)的路径
- __package__:导入包的路径
- __spec__:模块规格说明
- __annotations__:注解,一般用不到
- __builtins__:内建对象,一般用不到
- __loader__:导入系统加载模块时的对象,一般用不到
下面我们根据 函数、类、模块来分别举例说明
pkg包下面的 model.py 文件
函数中的用法:函数内部和外部获取 函数名、函数说明
类中的用法:类内部和外部获取 类名、类说明、方法名、方法说明
函数、类、模块中全部可以使用
直接执行本模块时
模块被导入时被动执行
特别解释:
1、if __name__ == '__mian__':
直接执行本模块时
- model 模块的 __name__ 返回 “__main__” 字符串。
- if __name__ == '__mian__': 因为条件满足了,所以 if __name__ == '__mian__': 下面的代码会被执行。
模块被导入时被动执行
- model 模块的 __name__ 返回 模块名称 “model” 字符串。
- if __name__ == '__mian__': 因为条件不满足了,所以 if __name__ == '__mian__': 下面的代码不会被执行。
2、同样的道理,__cached__、__package__、__spec__ 本模块中执行返回都为 None ,导入时执行,都不是None,所以在没有特殊情况下,也可以用这些变量来作为测试的条件。
以下四种测试条件相同
if __name__ == '__main__': # 其他模块导入时执行,条件不符合,以下代码不执行 print('测试代码')
if __cached__ is None: # 其他模块导入时执行,条件不符合,以下代码不执行 print('测试代码')
if __package__ is None: # 其他模块导入时执行,条件不符合,以下代码不执行 print('测试代码')
if __spec__ is None: # 其他模块导入时执行,条件不符合,以下代码不执行 print('测试代码')
其他特殊变量
__all__:用于模块导入时限制,只用于 from 模块 import *
- 被导入模块若定义了__all__属性,则只有__all__内指定的变量、方法、类可被导入
- 若没定义,则导入模块内的所有公有属性,方法和类
# model.py 文件,模块名称就叫 model__all__ = ('member', 'Person')member = '全局变量'def func(): print('一个函数')class Person: def __init__(self): pass def fun(self): print('一个方法')if __name__ == '__main__': func() # 返回:一个函数# user_model.py 文件,模块名称就叫 user_modelfrom model import *func() # 执行报错# user_model.py 文件,模块名称就叫 user_modelfrom model import funcfunc() # 正常执行
__slots__:在定义class的时候,定义一个特殊的__slots__变量,来限制该 class 实例能添加的属性范围。
特别说明:定义 __slots__ 变量后,类的实例就没有了 __dict__ 属性。
class Person: # slots定义的元素必须是字符串类型 __slots__ = ('name', 'sex', 'age') def __init__(self, name, sex): self.name = name self.sex = sexp = Person('jack', 'male')p.age = 30 # 正常添加属性p.height = 175 # 不能添加,报错p.__dict__ # 报错
__dict__:对象中当前已经定义的所有成员变量
class Person: def __init__(self, name, sex): self.name = name self.sex = sex def smoke(self): print('s')print(Person.__dict__) # 返回:字典太长,不放返回值了 解读:类的各种属性,方法的字典对象p = Person('jack', 'male')print(p.__dict__) # 返回:{'name': 'jack', 'sex': 'male'} 解读:类对象的属性
__class__:表示实例对应的类
class Person: country = '中国' def __init__(self, name, sex): self.name = name self.sex = sexp = Person('jack', 'male')# self.__class__将实例变量指向类,然后再去调用__name__类属性print(p.__class__.__name__) # 返回:Person 解读:返回类名print(p.__class__.country) # 返回:中国 解读:返回类属性country
先介绍这么多,记得关注、点赞哦