zoukankan      html  css  js  c++  java
  • python之类与对象(一)

    1.改变对象的字符串显示,要改变一个实例的字符串表示,可重新定义它的 str () 和 repr () 方法

    class Pair:
        def __init__(self, x, y):
            self.x = x
            self.y = y
    '''repr () 方法返回一个实例的代码表示形式,通常用来重新构造这个实例。内置的 repr() 函数返回这个字符串,跟我们使用交互式解释器显示的值是一样的。
    str () 方法将实例转换为一个字符串,使用 str() 或 print() 函数会输出这个字符串。'''
        def __repr__(self):
            return 'Pair({0.x!r},{0.y!r})'.format(self)#格式化代码 {0.x} 对应的是第 1 个参数的 x 属性
        def __str__(self):
            return '({0.x!r},{0.y!r})'.format(self)
    
    p = Pair(3,4)
    print(p) #默认输出str定义的内容
    print('{!r}'.format(p))
    print('{}'.format(p))
    
    
    #如果 str () 没有被定义,那么就会使用 repr () 来代替输出

    2.自定义字符串的格式化,我们需要在类上面定义 format () 方法

    _format = {
        'ymd': '{d.year}-{d.month}-{d.day}',
        'mdy': '{d.month}/{d.day}/{d.year}',
        'dmy': '{d.day}/{d.month}/{d.year}'
    }
    class Date:
        def __init__(self,year,month,day):
            self.year = year
            self.month = month
            self.day = day
    
        def __format__(self, code):
            if code == '':
                code='ymd'
            fmt =_format[code]
            return fmt.format(d=self)
    
    d = Date(2018,4,11)
    print(format(d)) #2018-4-11
    print(format(d,'mdy'))#4/11/2018
    
    
    from datetime import date
    d = date(2018,4,11)
    print(format(d))#2018-04-11
    print(format(d,'%A %B %Y %m %d'))#Wednesday April 2018 04 11

    3.在类中封装属性名,以单下划线_开头的名字,使用双下划线开始会导致访问名称变成其他形式,这种属性通过继承是无法被覆盖的

    有两种不同的编码约定 (单下划线和双下划线) 来命名私有属性,大多数而言,你应该让你的非公共名称以单下划线开 头。但是,如果代码会涉及到子类,并且有些内部属性应该在子类中隐藏起来,那么才考虑使用双下划线方案。

    4.在子类中调用父类的某个已经被覆盖的方法

    class Base:
        def __init__(self):
        print('Base.__init__')
    class A(Base):
        def __init__(self):
            Base.__init__(self)
            print('A.__init__')

    class Base:
        def __init__(self):
            print('Base.__init__')
    class A(Base):
        def __init__(self):
            super().__init__()
            print('A.__init__')
    class B(Base):
        def __init__(self):
            super().__init__()
            print('B.__init__')
    class C(A,B):
        def __init__(self):
            super().__init__() # Only one call to super() here
            print('C.__init__')
    
    c= C()
    print(c)
    print(C.__mro__)#MRO 列表就是一个简单的所有基类的线性顺序表
  • 相关阅读:
    NLP---word2vec的python实现
    matplotlib---Annotation标注
    matplotlib---legend图例
    matplotlib---设置坐标轴
    windows下右键新建md文件
    vue+webpack+npm 环境内存溢出解决办法
    element-ui tree树形组件自定义实现可展开选择表格
    vue-动态验证码
    ES6 数组函数forEach()、map()、filter()、find()、every()、some()、reduce()
    eslint配置文件规则
  • 原文地址:https://www.cnblogs.com/master-song/p/8796559.html
Copyright © 2011-2022 走看看