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 列表就是一个简单的所有基类的线性顺序表
原文地址:https://www.cnblogs.com/master-song/p/8796559.html