Python的类

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
2
3
4
5
6
7
8
9
10
11
12
13
14
# Python2中
class Person:
""" 不带object """
name = "zhengtong"

class Animal(object):
""" 带有object """
name = "chonghong"

if __name__ == "__main__":
x = Person()
print "Person", dir(x)
y = Animal()
print "Animal", dir(y)

运行结果

1
2
3
4
Person ['__doc__', '__module__', 'name']
Animal ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']

不继承object对象,只拥有了__doc__ , __module__和自己定义的变量, 继承object对象,拥有了好多可操作对象,这些都是对象都是类中的高级特性。 对于写大型项目来说,这些高级特性非常有用,比如说tornado里面的异常捕获时就有用到__class__来定位类的名称,还有高度灵活传参数的时候用到__dict__来完成。

这个区别在Python3中不复存在,为什么写这个?让你知道自己拥有了什么!

------ 本文结束------
赞赏此文?求鼓励,求支持!
  • 本文标题: Python的类
  • 本文作者: Jiang.G.F
  • 创建于: 2019年12月20日 - 15时12分
  • 更新于: 2020年03月03日 - 11时03分
  • 本文链接: https://gfjiangly.github.io/Python/python_class.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
0%