day 21

1.组合:某一各个对象拥有一个属性,该属性值等于另一个类的对象
为何要有组合:通过为某一个对象添加属性的方法,可以间接的将两个类关联起来,整合到一起,从而减少代码的日冗余

class OldboyPeople:
    shcool="oldboy"
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

class OldboyStudent(OldboyPeople):
    def __init__(self,name,age,sex,score=0):
        OldboyPeople.__init__(self,name,age,sex)
        self.score=score
        self.course=[]

    def choose_course(self):
        print("%s chooseing course "% (self.name))

    def tell_all_course(self):
        print("学生:%s的课程"%(self.name))
        for obj in self.course:
            obj.tell_info()

class OldoyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,level):
        OldboyPeople.__init__(self,name,age,sex)
        self.level=level
        self.courses = []

    def score(self,stu,num):
        stu.num=num
    def tell_all_course(self):
        print("教师:%s 教授的课程如下"%(self.name))
        for obj in self.courses:
            obj.tell_info()

class Course:
    def __init__(self,c_name,c_price,c_peroid):
        self.c_name=c_name
        self.c_price=c_price
        self.c_peroid=c_peroid

    def tell_info(self):
        print("<课程名:%s 价格:%s 周期:%s>" %(self.c_name,self.c_price,self.c_peroid))


python=Course("Python全栈开发",1000,"5.5个月")
Linux=Course("Linux运维",1000,'5.5')


stu=OldboyStudent("jxl",18,'')
stu.course.append(python)
stu.course.append(Linux)
stu.tell_all_course()


te=OldoyTeacher("jxl1",19,'',10)
te.courses.append(python)
te.tell_all_course()
.多态与多态性:
多态:同一类事物的不同形状
为何要用多态:
多态性:在多态的背景下,可以不再考虑对象的具体类型的前提下,直接使用对象
多态的精髓:统一
注:父类只是用来建立规范的,不能用来实例化,更无须实现内部的方法
Python 崇尚鸭子类型
 import  abc
class Aminal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        print("Aminal-1111")
    def run(self):
        print("Aminal-222")
class Dog(Aminal):
    def speak(self):
        print("dog-1111")
    def run(self):
        print("dog-2222")

dog=Dog()
dog.run()
三.封装:
装:往容器/名称空间里存放名字
封:指的是将存放在名称空间的名字给藏起来,这种隐藏对外不对内

如何封装:在类定义的属性前面,加__开头(没有__结尾)

总结:
1.__开头的属性实现的隐藏仅仅只是一种预语法意义上的变形,并不会真的限制类外部的访问
2.该变形操作只在类定义阶段检验语法是发生一次,类定义阶段之后新增的__开头的属性不会变形
3.如果父类不想让子类覆盖自己的属性,可以砸属性前加__开头

封装数据属性:将数据属性隐藏起来,类外部就无法直接操作属性,需要类内开辟一个接口来给外部使用间接的操作属性,可以在接口内定义任意的控制逻辑

封装函数的属性:隔离复杂度
class A:
    def __f1(self):
        print("a.f1")
    def f2(self):
        print("a.f2")
        self.__f1()   #>>obj._A__f1()

class B(A):
    def __f1(self):
        print("b.f1")

b=B()
b.f2()



class  People:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    def tell_info(self):
        print("名字:%s,年龄:%s" %(self.__name,self.__age))

    def set_inf(self,name,age):
        if not type(name)==str:
            print("名字的类型为str")
            return
        if not type(age)==int:
            print("年龄的类型为int")
            return
        self.__name=name
        self.__age=age

p=People("jxl",18)
p.tell_info()
p.set_inf("jxl1",13)
p.tell_info()
四.property:是一种装饰器,用来将类中的属伪装成数据属性
class People:
    def __init__(self,name,weith,height):
        self.name=name
        self.weith=weith
        self.height=height

    @property
    def amd(self):
       return self.weith/(self.height**2)



p=People('jxl',60,1.7)
print(p.amd)

 

posted @ 2018-08-21 16:25  jiangxiaolong_mrx  阅读(150)  评论(0编辑  收藏  举报