python类的属性或方法的访问权限及__call__方法

python类的属性或方法的访问权限及__call__方法

https://baijiahao.baidu.com/s?id=1667648572194870594&wfr=spider&for=pc

类属性或方法的访问权限

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,类型错误。

当然了,除非一些特殊的场景,一般情况下,这种用法,我们依然是不推荐的。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章