面向对象编程之二

1.继承

clas Person:
  pass
class Student(Person, XXX, )
  pass
子类方法没有 覆写 父类的方法或属性,则直接继承。

2.MRO(方法解析顺序) 用于确定子类实例中某方法继承自哪个父类
给结论:
python3 C3算法 使用 A.__mro__获取MRO顺序
python2.2中 经典类 DFS 深度优先搜索, 有了新式类;广度优先搜索BFS
python2.3 中开始 新式类 C3算法
python2.2之前多没有新式类。
经典类存活与python3之前

 

C3算法的说明:

如图,计算A的的继承顺序

# L[D]=[D,object]
# L[E]=[E,object]
# L[B]=B + merge(L[D],L[E])
# L[B]= B+ merge([D,object],[E,object],D,E)
# L[B]= [B,D,E,object]
# L[A]=A + merge(L[B],L[C],B,C)
# L[A]=A + merge([B,D,E,object],[C,E,F,object],B,C)
# L[A]=A + merge([object],[F,object])
# L[A]= [A,B,D,C,E,F,object]

3.多态:

调用方只管调用,不管细节, 调用子类对象与调用父类对象一样。 符合“开闭原则”,对新增扩展开放,对修改闭合。

isinstance(实例,类) 判断 实例是否为类的对象。
子类的实例 判断是否为父类的对象返回为True
父类的实例 判断是否为子类的对象返回为False

super方法 调用父类的方法。

class FooParent(object):
def __init__(self):
self.parent = 'I\'m the parent.'
print('Parent')

def bar(self, message):
print("%s from Parent" % message)


class FooChild(FooParent):
def __init__(self):
# super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类B的对象 FooChild 转换为类 FooParent 的对象
super(FooChild, self).__init__()
print('Child')

def bar(self, message):
super(FooChild, self).bar(message)
print('Child bar fuction')
print(self.parent)


if __name__ == '__main__':
fooChild = FooChild()
fooChild.bar('HelloWorld')

# 打印结果为:
# Parent
# Child
# HelloWorld from Parent
# Child bar fuction
# I'm the parent.

4. 动态绑定属性
__slots__访问限制 不允许用户随意添加属性
注意事项: __slots__只对当前类的实例起作用,对子类不起作用

class Person:
__slots__ = ('name','age')
def __init__(self,name,age):
self.name = name
self.age = age
print('这个人的信息为:%s,%s' %(self.name,self.age))

A = Person('jane',19)

5. @property 函数转属性,只读属性

class Hourse:
@property
def size(self):
return self._size
@size.setter
def size(self,value):
self._size = value
@property
def prise(self):
return self._prise
@prise.setter
def prise(self,value):
self._prise = value
@property
def locate(self):
print("这是一个%s平方米,%s价格,在北京的房子" %(self.size,self.prise))

A=Hourse()
A.size=100
A.prise=200
A.locate

 

posted @ 2018-11-08 10:58  茶色阳光  阅读(147)  评论(0编辑  收藏  举报