使用if报错_python 模块的特殊变量,手动使用

前面有篇文章讲解了【类的特殊方法,自动调用】,现在说一下 内置特殊变量,直接使用。

我们先看一下,内置全局变量有哪些,用 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__:导入系统加载模块时的对象,一般用不到
24f0bdeafd8c45d4d01bc520296f31cf.png

下面我们根据 函数、类、模块来分别举例说明

pkg包下面的 model.py 文件

函数中的用法:函数内部和外部获取 函数名、函数说明

5c9fdc106568a120f6d76c80997ea090.png

类中的用法:类内部和外部获取 类名、类说明、方法名、方法说明

1994f1a45b883be249cd29058472cc76.png

函数、类、模块中全部可以使用

直接执行本模块时

e000302d67318f64111a8ddc632fae61.png

模块被导入时被动执行

9828f1e786f4aee44de39c4f284e874d.png

特别解释:

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

先介绍这么多,记得关注、点赞哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值