zoukankan      html  css  js  c++  java
  • python 的print和特殊方法 __str__和__repr__

    先提出一个疑问,为什么print函数可以直接打印参数呢?即使是数字?例如print 1,就会打印1。我们知道1的类型是整型(题外话,在python中1是常量,也是类int的对象,而java中1只是常量),按理说print接受的参数应该是字符串啊?

    回答:

    因为print函数会首先调用str()函数将参数转化为str类型,而str()函数会调用这个参数所属类中的__str__方法(如果类中有此方法的话),我们可以重写这个__str__方法。

    1 class poo(object):
    2     def __str__(self):
    3         return "haha"
    4 p = poo()
    5 print p#打印haha

    来一个特殊的,类对象(普通对象的类是类,就像上面的p对象,他所属类是poo,python一切接对象,poo这个类也是对象,那么他所属哪个类呢?答案是元类type,当然我们也可以通过继承type创建一个元类,然后指定poo所属类为我们创建的这个元类):

    1 class M(type):
    2     def __str__(self):
    3         return "gege"
    4 
    5 class TM:
    6     __metaclass__ = M#指定类对象TM所属类为M
    7 print (TM.__class__)
    8 print TM#调用TM所属类的__str__方法

    如果这个参数所属的类中,没有__str__方法,会出现什么情况呢?这里只说现象,为什么会这样留着以后进一步研究(个人初步猜想是py2为了让经典类兼容新式类的举措。在py2中没有继承object类的类叫做经典类,而py3中所有的类都继承了object,也就不存在新旧类的区分了,而新式类由于继承object,继而有__str__方法,__base__,__class__等属性。

    py2为了和py3保持统一,即使我们定义经典类时不定义__class__属性,py2也会运用某种机制,使得经典类的对象同样可以像python3的对象那样调用__class__属性)

    1 class b:
    2     pass
    3 bb = b()
    4 print bb#<__main__.b instance at 0x02AFD530>
    5 print dir(bb)#['__doc__', '__module__']
    6 print bb.__class__#__main__.b,类中没有__class__属性,却可以调用
  • 相关阅读:
    必会重构技巧(二):使用多态替换条件
    必会重构技巧(五):划分职责
    Flickr 网站架构分析
    必会重构技巧(三):提取接口
    WCF 一步一步 发布 WCF服务 到 IIS (图)
    LINQ 图解
    在Silverlight中如何创建WCF Service
    必会重构技巧(四):提取工厂类
    技术汇总:第十四章:电脑端生成支付宝二维码支付
    HDU 4463 Outlets 2012年亚洲区域赛杭州赛区现场赛K题
  • 原文地址:https://www.cnblogs.com/saolv/p/7833706.html
Copyright © 2011-2022 走看看