您的位置:首页 > 编程语言 > Python开发

Python拾遗之类属性和实例属性(二)

2017-05-06 22:48 381 查看

关于类属性和实例属性(二)

关于类的属性访问和调用规则:

类的属性:,这里所指的属性包括方法和数据,从访问权限上分,分为公有,私有两种

先说说私有属性,一种是单下划线开头的,模块级别的私有,在不同包之间以from module import 形式导入的模块,该模块里的单下划线私有属性都不会在导入的模块被成功访问到,而导入的是同一个包下面的模块,恰恰相反,只有from module import ,才在导入的模块里访问到被导入模块里的单下划线开头的私有属性。其余方式的外部访问,皆可以进行。而对于双下滑开头的数据属性,以类名称访问或者实例名称访问属性,都不会在外部被访问到,但是你可以通过特殊方法(AccessName._Classname__privatevalue,就是所谓的混淆规则,目的是避免名称空间混乱)可以访问到,如果是双下划线开头的方法属性,如果是实例方法属性,除了用特殊方法外调用者还必须是实例本身,不能是类名称,这调用限制就是所谓的调用绑定方法

如果是在类方法或者是静态方法前面加双下划线的私有属性,那么调用者只需遵守上述的特殊方法即可,如果没有特殊方法,双下划线开头的方法属性只能在类内部访问调用,并且面对实例方法的依旧是调用绑定方法的准则,并且只有实例方法才能调用实例属性(实例数据和实例方法)。

再谈谈公有属性:静态方法和类方法,还有个静态属性(静态数据),这些都可以用类的名称在全局的名字空间(名称空间)进行访问,涉及到私有权限,还是遵循上述讲到的规则,涉及到实例属性(方法属性和数据属性),依旧遵照调用绑定方法的准则,例如静态方法不可以直接调用实例方法,除非在调用前实例化再以实例名称调用实例方法。并且静态方法和类方法都可以调用,静态属性并且修改,而如果实例试图修改静态数据,将会被在python解释器在底层给屏蔽(另外创建一个同名实例属性变量),不管怎么样,静态方法中的静态属性的定义和调用尽量是以类作为调用者(ClassName.StaticValue),在类方法中的静态属性的定义和调用也尽量是以类作为调用者(cls.StaticValue)。

搁笔至此,总而言之,言而总之,对于Python的这些规则,看似毫无逻辑,实则还是还是有主线和规则的,不管是实例属性还是类属性的使用,都是在调用绑定方法,调用非绑定方法,以及Python解释器的屏蔽规则以及私有属性访问规则之下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息