每个人都有自己的隐私,不想被别人窥探,python中的类也是一样的,也有自己的小秘密。
类属性或方法的访问权限
python中,实例化了一个类的对象后,可以通过该对象,访问类中的属性或方法。如下:
类属性或方法调用
当我们存在一些属性或方法,只希望在类内部被使用,而不希望从外部使用时,可以通过__(双下划线)开头的形式来制定标识符。这样定义的属性或方法,是不能从外部访问的,否则会报AttributeError,属性错误。如下:
不合法的调用方式
在某些语言中,可能会用到private,public等类似的关键字,来达到属性或方法的访问权限限制,但是,在python中,采用了双下划线开头的方式。
类的专有方法
在学习运算符时,我们发现有些运算符,如 + 号,可用应用于数字,字符串,列表等。那么,它是否可以应用于我们自定义的类呢?
答案是可以的。python规定了一系列专有方法,当你希望你自定义的类支持某个运行符时,你需要在类中添加它们。如 + 号:
加号
如果没有定义__add__方法,就尝试使用 + 号,会报TypeError,类型错误。
同样的,还有下面这些:
__init__ : 构造函数,在生成对象时调用__del__ : 析构函数,释放对象时使用__repr__ : 打印,转换__setitem__ : 按照索引赋值__getitem__: 按照索引获取值__len__: 获得长度__cmp__: 比较运算__call__: 函数调用__sub__: 减运算__mul__: 乘运算__truediv__: 除运算__mod__: 求余运算__pow__: 乘方运算对上面一些可能有疑惑的方法进行一个说明。比如说:
__repr__会在你尝试打印或转换对象时使用,比如说你尝试通过 print函数将对象test1打印出来,就会调用__repr__,打印的内容即是__repr__方法的返回值。如下:
打印
当你尝试通过索引操作对象时,会调用__getitem__或__setitem__,当尝试通过len函数操作对象时,会调用__len__。如下:
索引和长度
当你希望通过比较运算符对对象进行比较时,你需要提供__cmp__方法。在python3的最新版本中,__cmp__方法被移除了,新增了一系列方法,如__eq__用于判断是否相等,__ne__用于判断是否不等,__gt__用于判断是否大于,__lt__用于判断是否小于,__ge__用于判断是否大于等于,__le__用于判断是否小于等于。有趣的是,python比想象的要聪明些。当你提供了__eq__方法,即使不提供__ne__方法,也可以使用 != 。当你提供了__gt__,就可以使用 > 或 <。当你提供了__le__,就可以使用 >= 或 <=。如下:
比较
需要注意的是,当你尝试使用sorted函数,对某个自定义对象组成的序列进行排序时,必须提供__gt__或__lt__二者之一。否则会报TypeError,类型错误。
__call__方法,可以帮助你把对象当成一个函数来使用。如下:
对象变函数
如上,test1是一个对象,但是在第8行,却能当成一个函数来使用。当然,如果没有提供__call__方法,会报TypeError,类型错误。
当然了,除非一些特殊的场景,一般情况下,这种用法,我们依然是不推荐的。