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 列表就是一个简单的所有基类的线性顺序表