repr
# object中因为有__repr__方法,所以直接打印实例化对象会有下面这句打印出来
<__main__.CLanguage object at 0x000001A7275221D0>
# 在类中重写__repr__函数,
class CLanguage:
def __init__(self):
self.name = "C语言中文网"
self.add = "http://c.biancheng.net"
def __repr__(self):
return "CLanguage[name="+ self.name +",add=" + self.add +"]"
clangs = CLanguage()
print(clangs)
# 输出
CLanguage[name=C语言中文网,add=http://c.biancheng.net]
可以看出__repr__的作用就是打印实例信息
call
通过在 类中实现 call() 方法,使得实例对象变为可调用对象。即实例对象后面可以加()。
对于可调用对象,实际上“名称()”可以理解为是“名称.call()”的简写。
class CLanguage:
def __init__ (self):
self.name = "C语言中文网"
self.add = "http://c.biancheng.net"
def say(self):
print("我正在学Python")
clangs = CLanguage()
if hasattr(clangs,"name"):
print(hasattr(clangs.name,"__call__"))
print("**********")
if hasattr(clangs,"say"):
print(hasattr(clangs.say,"__call__"))
# 输出结果
False
**********
True
# 总结
可以看到,由于 name 是类属性,它没有以 __call__ 为名的 __call__() 方法;而 say 是类方法,它是可调用对象,因此它有 __call__() 方法。