11. 有下划线的函数

268 阅读2分钟

_xxx:全局属性、全局方法不可被外部模块访问

1._xxx命名的全局属性、全局方法为module中的私有属性、私有方法,意味着该全局属性、全局方法在当前模块可以调用,但不应该在外部模块直接调用: 当使用 from module import * 时,该module_xxx命名的属性、方法不能被导入。

有种方式可以在外部调用但是不建议:

import module

module._xxx

module._xxx()

2._xxx命名的类内属性、类内方法。与普通的类内属性,类内方法一样。

class father():
    _E = 00000

    def __init__(self,_name):
        self._name='Lily'
    def _eat(self):
        print("吃饭呢")


class son(father):
    pass

f=father('Hoily')
f._eat()#输出:吃饭呢

s=son('Mike')
s._eat()#输出:吃饭呢

_ _xxx:全局属性、全局方法不可被外部模块访问;类内属性,类内方法不可被子类访问

1._ _xxx命名的全局属性、全局方法为module中的私有属性、私有方法,意味着该全局属性、全局方法在当前模块可以调用,但不应该在外部模块直接调用:当使用 from module import * 时,该module_xxx命名的属性、方法不能被导入。

有种方式可以在外部调用但是不建议:

import module

module._ _xxx

module._ _xxx()

2._ _xxx命名的类内属性、类内方法。这种命名方式更多在于类的继承,通过_ _xxx命名类内的属性、方法,可以防止被子类重写。如果通过实例化类去调用_ _xxx命名类内的属性、方法,必须通过实例._类名_ _xxx

除了不能继承给子类特殊的调用规则以外,其他的与普通的类内属性,类内方法一样。

class father():
    __E = 00000

    def __init__(self,__name):
        self.__name='Lily'
    def __eat(self):
        print("吃饭呢")


class son(father):
    pass

f=father('Hoily')
f._father__eat() #输出:吃饭呢

s=son('Mike')
s._son_ _eat()#报错:'son' object has no attribute '_son_ _eat'

xxx_:使用关键字命名的属性、方法

如果定义的属性或者方法的名称与Python中的关键字(例如 def、class、return)冲突,可以将该属性或者方法名称后面加上一个下划线就可以使用了,就如def_、class_、return_。

_ _xxx_ _:系统定义的方法(魔法方法)

罗列一些比较常见的,有记忆就可:

obj为一个对象
obj=MyClass()
实际上调用:x._ _init_ _()

obj为一个对象
result=obj()
实际上调用:obj.__call__()

x==y
实际上调用:x._ _eq_ _(y)


len(seq)  
实际上调用:seq._ _len_ _()

x._ _sizeof_ _()
含义:x在内存中的字节数, x为class得话, 就应该是x._ _basicsize_ _()

x为一个列表
x[y]
实际上调用:x._ _getitem_ _(y)

obj为一个对象
obj=MyClass()
obj._ _ dir()_ _
含义:查看一个变量的所有方法和变量