变量名的分类:
以数字字母开头:正常的公有变量,如:a=1, def a()
以单下划线开头:半私有,如:_b = 2, def _bb()
以双下划线开头:私有,如:__c = 3, def __cc()
以双下划线开头双下划线结尾:内置属性名或魔法方法名(系统定义的名字),如:__name__, __dir__
公有
任何人都可以使用
半私有
1. 类外
类外的半私有对象、私有对象,功能一致,均是在本模块中可以正常使用,但是不能被直接导入并调用
如果一定要在模块外使用,那么需要导入本模块,然后使用(模块名.变量名)进行调用
2. 类中
类中的半私有对象,仅仅是概念上的私有,默认不要在类外进行调用
实际在类外,均可以使用(实例名.变量名/类名.变量名)进行调用
私有
1. 类外
同半私有一样
2. 类中
类中的私有对象,在类外均不能直接调用,可以理解为真私有
但是python没有完全私有的对象,此种对象可以通过矫直在类外进行调用的(在私有属性名、私有方法名前添加(_类名))
魔法方法
这是python自己实现的属性和方法,一般不允许以这种方式自定义属性或方法
半私有举例:
在d2.py中调用d1.py中的半私有函数
d1.py
def _init(): global _global_dict _global_dict = {} def set_value(key, value): _global_dict[key] = value def get_value(key): return _global_dict[key]
d2.py
import d1 # 导入d1模块 d1._init() # 使用模块名.函数名进行调用 d1.set_value('name1', 'zhangsan') print(d1.get_value('name1'))
另,
d2.py(以下会报错)
from d1 import * _init() # 会提示错误:Unresolved reference '_init'
d2.py(以下不报错,这是为啥子呢?)
from d1 import _init _init() # 不报错