Q1 在__init__
内和在__init__
外定义成员变量区别
A 变量定义在__init__
之外, 该变量隶属于这个类,访问方式:类名.变量
。通过类名称直接去修改__init__
之外的变量,可以保持全局同步。变量定义在__init__
之内,该变量隶属于这个实例对象,访问方式:对象名.变量
Q2 如何实现类似于C++/Java之类语言的对对象成员或方法访问权限限制
A Python中没有访问控制的关键字,例如private、protected等等。但是,在Python编码中,有一些约定来进行访问控制。 变量名前加双下划线,可以使变量变为私有,无法从类外访问(并不准确,其实还是有方法可以访问),子类也不可访问(与C++不同),但是,如果一个属性以__xxx__
的形式定义,那它又可以被外部访问了,以__xxx__
定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用__xxx__
定义。 以单下划线开头的属性_xxx
虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。 也就是说Python希望程序员遵守约定而不是从语言层面强制如此。
至于方法的使用控制,目前没找到相关文档。
题外话:在Python中,通过单下划线_
来实现函数模块级别的私有化,变量除外。一般约定以单下划线_
开头的函数为模块私有的,也就是说from moduleName import *
将不会引入以单下划线_
开头的函数。
Q3 如果一个类不继承自其它类, 就显式的从object继承. 嵌套类也一样.
A3 在Python3中不需显示的继承object,默认如果没有任何继承那么就继承object
1 | # Python2中 |
运行结果
1 | Person ['__doc__', '__module__', 'name'] |
不继承object对象,只拥有了__doc__
, __module__
和自己定义的变量, 继承object对象,拥有了好多可操作对象,这些都是对象都是类中的高级特性。 对于写大型项目来说,这些高级特性非常有用,比如说tornado里面的异常捕获时就有用到__class__
来定位类的名称,还有高度灵活传参数的时候用到__dict__
来完成。
这个区别在Python3中不复存在,为什么写这个?让你知道自己拥有了什么!