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

每个人都有自己的隐私,不想被别人窥探,python中的类也是一样的,也有自己的小秘密。

类属性或方法的访问权限

python中,实例化了一个类的对象后,可以通过该对象,访问类中的属性或方法。如下:

4e4a20a4462309f7369839004f90b4f5d6cad656.jpeg?token=0f6de55cfa718fb532df6bf7c3190e66类属性或方法调用

当我们存在一些属性或方法,只希望在类内部被使用,而不希望从外部使用时,可以通过__(双下划线)开头的形式来制定标识符。这样定义的属性或方法,是不能从外部访问的,否则会报AttributeError,属性错误。如下:

a044ad345982b2b798523e6a0c3373e974099bf7.png?token=11875c346524540cb59d739da8bb6f63不合法的调用方式

在某些语言中,可能会用到private,public等类似的关键字,来达到属性或方法的访问权限限制,但是,在python中,采用了双下划线开头的方式。

类的专有方法

在学习运算符时,我们发现有些运算符,如 + 号,可用应用于数字,字符串,列表等。那么,它是否可以应用于我们自定义的类呢?

答案是可以的。python规定了一系列专有方法,当你希望你自定义的类支持某个运行符时,你需要在类中添加它们。如 + 号:

4afbfbedab64034fcff9be8c925dc1370b551dac.png?token=1531f26675c9c52c755f14e36779555c加号

如果没有定义__add__方法,就尝试使用 + 号,会报TypeError,类型错误。

同样的,还有下面这些:

__init__ : 构造函数,在生成对象时调用__del__ : 析构函数,释放对象时使用__repr__ : 打印,转换__setitem__ : 按照索引赋值__getitem__: 按照索引获取值__len__: 获得长度__cmp__: 比较运算__call__: 函数调用__sub__: 减运算__mul__: 乘运算__truediv__: 除运算__mod__: 求余运算__pow__: 乘方运算对上面一些可能有疑惑的方法进行一个说明。比如说:

__repr__会在你尝试打印或转换对象时使用,比如说你尝试通过 print函数将对象test1打印出来,就会调用__repr__,打印的内容即是__repr__方法的返回值。如下:

738b4710b912c8fca604ae51c39d2a43d48821df.png?token=f74d11233617819622f3064232920799打印

当你尝试通过索引操作对象时,会调用__getitem__或__setitem__,当尝试通过len函数操作对象时,会调用__len__。如下:

574e9258d109b3de1aa3fbe9f221d487810a4cb3.png?token=6bf775de9c238363a593e8901dfd2a97索引和长度

当你希望通过比较运算符对对象进行比较时,你需要提供__cmp__方法。在python3的最新版本中,__cmp__方法被移除了,新增了一系列方法,如__eq__用于判断是否相等,__ne__用于判断是否不等,__gt__用于判断是否大于,__lt__用于判断是否小于,__ge__用于判断是否大于等于,__le__用于判断是否小于等于。有趣的是,python比想象的要聪明些。当你提供了__eq__方法,即使不提供__ne__方法,也可以使用 != 。当你提供了__gt__,就可以使用 > 或 <。当你提供了__le__,就可以使用 >= 或 <=。如下:

0823dd54564e925817ef5b25a21c695ecebf4e43.png?token=081309d2ffc46c6c5b94b016b8c87383比较

需要注意的是,当你尝试使用sorted函数,对某个自定义对象组成的序列进行排序时,必须提供__gt__或__lt__二者之一。否则会报TypeError,类型错误。

__call__方法,可以帮助你把对象当成一个函数来使用。如下:

4bed2e738bd4b31cf2970632b9489f799f2ff831.png?token=53f86a92116d72c5648b33a1c44ea507对象变函数

如上,test1是一个对象,但是在第8行,却能当成一个函数来使用。当然,如果没有提供__call__方法,会报TypeError,类型错误。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值