问题一
在Python中万物皆对象,函数也是对象,类也是对象,创建的字符串是字符串对象,元组是元组对象,列表是列表对象。
为什么函数对象加个括号可以调用,其它对象加个括号调用不了?底层的原理是什么?
对象可以不可以加个括号调用,是由___call__方法决定的。
如果创建的类,底层实现了__call__方法,那么它就可以调用。如果没实现__call__方法,那么就调用不了。
class MyClass(object):
def __init__(self,name):
self.name=name
def __str__(self):
print("---str--触发了--")
return self.name
def __repr__(self):
print("__repr__被触发")
return '<myClass.object-{}'.format(self.name)
m= MyClass("清菡")
# print(m)
# str(m)
# format(m)
# res=repr(m)
# print(res)
def fun():
print("----------")
a = "100"
fun()
a()
字符串这个对象不能被调用。
问题二
如果想让类创建出来的对象,可以像函数一样被调用可以实现吗?
能不能被调用,由__call__方法来决定。自己在类里面实现一个__call__方法:
class MyClass(object):
def __init__(self,name):
self.name=name
def __str__(self):
print("---str--触发了--")
return self.name
def __repr__(self):
print("__repr__被触发")
return '<myClass.object-{}'.format(self.name)
def __call__(self, *args, **kwargs):
#对象像函数一样调用的时候触发
print("___call___")
m= MyClass("清菡")
# print(m)
# str(m)
# format(m)
# res=repr(m)
# print(res)
def fun():
print("----------")
fun()
m()
![5d05c3c75c31e3dc951eef87c260e1de.png](https://img-blog.csdnimg.cn/img_convert/5d05c3c75c31e3dc951eef87c260e1de.png)
精彩推荐
基础篇-http协议《http 简介、url详解、request》