• 面向对象


    1.在子类中重用父类的属性
    在子类派生出的新的方法中重用父类的方法:有两种实现方式:
    方式一:指名道姓(不依赖继承)
    Hero.attack(self,enemy) # 指名道姓 不依赖继承
    Hero.__init__(self,nickname,life_value,aggressivity) # 指名道姓 不依赖继承
    方式二:super() (依赖继承) super() 会从对象的(MRO)列表中找
    super(Garen,self).attack(enemy) # 依赖继承
    super(Garen,self).__init__(nickname,life_value,aggressivity) # 依赖继承 py2 写法
    super().__init__(nickname,life_value,aggressivity) # py3 写法
      1 # class Hero:
      2 #     def __init__(self, nickname, life_value, aggressivity):
      3 #         self.nickname = nickname
      4 #         self.life_value = life_value
      5 #         self.aggressivity = aggressivity
      6 #
      7 #     def attack(self, enemy):
      8 #         enemy.life_value -= self.aggressivity
      9 #
     10 # class Garen(Hero):
     11 #     camp = 'Demacia'
     12 #     def attack(self, enemy):
     13 #         Hero.attack(self,enemy)  # 指名道姓 不依赖继承
     14 #         print('from Garen Class')
     15 #
     16 # class Riven(Hero):
     17 #     camp = 'Noxus'
     18 #
     19 # g1 = Garen('草丛伦',100,30)
     20 # r1 = Riven('锐雯雯',80,50)
     21 #
     22 # print(r1.life_value)
     23 # g1.attack(r1)
     24 # print(r1.life_value)
     25 
     26 # ---------------------------------------------------------------------
     27 
     28 # class Hero:
     29 #     def __init__(self, nickname, life_value, aggressivity):
     30 #         self.nickname = nickname
     31 #         self.life_value = life_value
     32 #         self.aggressivity = aggressivity
     33 #
     34 #     def attack(self, enemy):
     35 #         enemy.life_value -= self.aggressivity
     36 #
     37 # class Garen(Hero):
     38 #     camp = 'Demacia'
     39 #
     40 #     def __init__(self, nickname, life_value, aggressivity,weapon):
     41 #         Hero.__init__(self,nickname,life_value,aggressivity) # 指名道姓 不依赖继承
     42 #         self.weapon = weapon
     43 #
     44 #     def attack(self, enemy):
     45 #         Hero.attack(self,enemy)  # 指名道姓 不依赖继承
     46 #         print('from Garen Class')
     47 #
     48 # class Riven(Hero):
     49 #     camp = 'Noxus'
     50 #
     51 # g1 = Garen('草丛伦',100,30,'金箍棒')
     52 # print(g1.__dict__)
     53 
     54 # ---------------------------------------------------------------------
     55 
     56 # class Hero:
     57 #     def __init__(self, nickname, life_value, aggressivity):
     58 #         self.nickname = nickname
     59 #         self.life_value = life_value
     60 #         self.aggressivity = aggressivity
     61 #
     62 #     def attack(self, enemy):
     63 #         enemy.life_value -= self.aggressivity
     64 #
     65 # class Garen(Hero):
     66 #     camp = 'Demacia'
     67 #     def attack(self, enemy):
     68 #         super(Garen,self).attack(enemy)  # 依赖继承
     69 #         print('from Garen Class')
     70 #
     71 # class Riven(Hero):
     72 #     camp = 'Noxus'
     73 #
     74 # g1 = Garen('草丛伦',100,30)
     75 # r1 = Riven('锐雯雯',80,50)
     76 #
     77 # print(r1.life_value)
     78 # g1.attack(r1)
     79 # print(r1.life_value)
     80 
     81 # ---------------------------------------------------------------------
     82 
     83 # class Hero:
     84 #     def __init__(self, nickname, life_value, aggressivity):
     85 #         self.nickname = nickname
     86 #         self.life_value = life_value
     87 #         self.aggressivity = aggressivity
     88 #
     89 #     def attack(self, enemy):
     90 #         enemy.life_value -= self.aggressivity
     91 #
     92 # class Garen(Hero):
     93 #     camp = 'Demacia'
     94 #
     95 #     def __init__(self, nickname, life_value, aggressivity,weapon):
     96 #         # super(Garen,self).__init__(nickname,life_value,aggressivity)  # 依赖继承  py2这样写
     97 #         super().__init__(nickname,life_value,aggressivity)   # py3这样写
     98 #         self.weapon = weapon
     99 #
    100 #     def attack(self, enemy):
    101 #         Hero.attack(self,enemy)  # 知名道姓 不依赖继承
    102 #         print('from Garen Class')
    103 #
    104 # class Riven(Hero):
    105 #     camp = 'Noxus'
    106 #
    107 # g1 = Garen('草丛伦',100,30,'金箍棒')
    108 # print(g1.__dict__)
    109 
    110 # ---------------------------------------------------------------------
    111 
    112 class A:
    113     def f1(self):
    114         print('from A')
    115         super().f1()
    116 
    117 class B:
    118     def f1(self):
    119         print('from B')
    120 
    121 class C(A,B):
    122     pass
    123 
    124 # print(C.mro())
    125 # [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
    126 c = C()
    127 c.f1()
    128 # from A
    129 # from B
    2.组合
    选课系统 老师类 学生类
    组合: 什么有什么 # 继承:什么是什么 代码重用
    老师类的数据属性 = 课程类/[] 什么有什么 eg:老师有课程 学生有生日
    student1.course1.tell_info()
    student1.birth.tell_info()
     1 class People:
     2     school = 'luffycity'
     3 
     4     def __init__(self,name,age,sex):
     5         self.name=name
     6         self.age=age
     7         self.sex=sex
     8 
     9 
    10 class Teacher(People):
    11     def __init__(self,name,age,sex,level,salary):
    12         super().__init__(name,age,sex)
    13         self.level=level
    14         self.salay=salary
    15 
    16     def teach(self):
    17         print('%s is teaching' %self.name)
    18 
    19 
    20 class Student(People):
    21     def __init__(self,name,age,sex,class_time):
    22         super().__init__(name,age,sex)
    23         self.class_time=class_time
    24 
    25     def learn(self):
    26         print('%s is teaching' %self.name)
    27 
    28 
    29 class Course:
    30     def __init__(self,course_name,course_price,course_period):
    31         self.course_name=course_name
    32         self.course_price=course_price
    33         self.course_period=course_period
    34 
    35     def tell_info(self):
    36         print('课程名<%s> 课程价钱<%s> 课程周期<%s>'%(self.course_name,self.course_price,self.course_period))
    37 
    38 
    39 class Date:
    40     def __init__(self,year,month,day):
    41         self.year=year
    42         self.month=month
    43         self.day=day
    44 
    45     def tell_info(self):
    46         print('%s-%s-%s'%(self.year,self.month,self.day))
    47 
    48 
    49 # teacher1=Teacher('alex',18,'male',10,3000)
    50 # teacher2=Teacher('egon',28,'male',30,3000)
    51 #
    52 # python=Course('python',3000,'3mons')
    53 # linux=Course('linux',2000,'4mons')
    54 # print(python.course_name)
    55 # teacher1.course=python
    56 # teacher2.course=python
    57 
    58 # print(python)
    59 # print(teacher1.course)
    60 # print(teacher2.course)
    61 # print(teacher1.course.course_name) # teacher1的教的课程
    62 # print(teacher2.course.course_name)
    63 
    64 # teacher1.course.tell_info()
    65 
    66 # student1=Student('egon',20,'female','08:30:00')
    67 # student1.course1=python
    68 # student1.course2=linux
    69 
    70 # student1.course1.tell_info()
    71 # student1.course2.tell_info()
    72 
    73 # student1.course=[]
    74 # student1.course.append(python)
    75 # student1.course.append(linux)
    76 # student1.course[0].tell_info()
    77 # student1.course[1].tell_info()
    78 
    79 # 需求 日期类 学生和生日的关系 学生有生日
    80 student1=Student('egon',20,'female','08:30:00')
    81 d = Date(1988,4,20)
    82 python=Course('python',3000,'3mons')
    83 student1.birth=d
    84 student1.birth.tell_info()
    85 student1.course=python
    86 student1.course.tell_info()
    3.抽象类
    人 猪 狗 都是动物 走的功能 名称不一样 找一种统一的方案
    java 有interface 可以解决统一的方案!
    在python中根本就没有一个叫做interface的关键字,如果非要去模仿接口的概念
    可以借助第三方模块:http://pypi.python.org/pypi/zope.interface
    但python 有自己的抽象类
    抽象类: 只能被继承 不能被实例化 本质上还是一个类 功能就是规范子类
    基于继承演变而来的! 好处降低使用者的使用复杂度 统一标准
     1 import abc
     2 class Animal(metaclass=abc.ABCMeta):   # 通过抽象类把子类的标准规范起来了
     3     all_type = 'animal'
     4     @abc.abstractmethod
     5     def run(self):
     6         pass
     7 
     8     @abc.abstractmethod
     9     def eat(self):
    10         pass
    11 
    12 animal = Animal()   # 不能实例化抽象类
    13 
    14 class People(Animal):
    15     def run(self):
    16         print('people is runing')
    17 
    18     def eat(self):
    19         print('people is eatint')
    20 
    21 class Pig(Animal):
    22     def run(self):
    23         print('pig is runing')
    24 
    25     def eat(self):
    26         print('pig is eating')
    27 
    28 class Dog(Animal):
    29     def run(self):
    30         print('dog is runing')
    31 
    32     def eat(self):
    33         print('dog is eating')
    34 
    35 # peo1=People()
    36 # pig1=Pig()
    37 # dog1=Dog()
    38 #
    39 # peo1.run()
    40 # peo1.eat()
    41 # pig1.run()
    42 # dog1.run()
    43 #
    44 # print(peo1.all_type)
    4.多态与多态性
    多态:指的就是同一类事物有多种形态,
    eg:动物有多种形态: 人 狗 猪
    文件有多种形态: 文本文件 可执行文件
    多态的好处:
    多态性:指的是可以在不考虑对象的类型的情况下而直接使用对象
    动态多态性:# peo1.talk()
    静态多态性:# str int list 可相加+ str+str int+int
    多态性的好处:
    1.增加了程序的灵活性 -- 建立在多态的前提下
       以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
    2.增加了程序的扩展性
     通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用   
     1 # 多态:同一类事物的多种形态
     2 import abc
     3 class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
     4     @abc.abstractmethod
     5     def talk(self):
     6         pass
     7 
     8 class People(Animal): #动物的形态之一:人
     9     def talk(self):
    10         print('say hello')
    11 
    12 class Dog(Animal): #动物的形态之二:狗
    13     def talk(self):
    14         print('say wangwang')
    15 
    16 class Pig(Animal): #动物的形态之三:猪
    17     def talk(self):
    18         print('say aoao')
    19 
    20 class Cat(Animal):  # 扩展的
    21     def talk(self):
    22         print('say miaomiao')
    23 
    24 # 多态性:指的是可以在不考虑对象的类型的情况下而直接使用对象
    25 peo1=People()
    26 dog1=Dog()
    27 pig1=Pig()
    28 cat1=Cat()
    29 # peo1.talk()  # 动态多态性
    30 # dog1.talk()
    31 # pig1.talk()
    32 
    33 # 不考虑对象的类型的情况下而直接使用对象
    34 # eg.学开车 学的是怎么开车 不是怎么开具体哪款车 tesla 宝马等 多态性带来的好处
    35 def fun(animal):
    36     animal.talk()
    37 
    38 fun(peo1)
    39 fun(pig1)
    40 fun(dog1)
    41 fun(cat1)  # 在使用的时 直接使用
    5.鸭子类型
    python 崇尚鸭子类型
    鸭子类型: 类与类之间不用共同继承父类,只要做的像一种事物
    不继承父类 有共同的方法 给使用者带来了直观性
     1 # class Disk:
     2 #     def read(self):
     3 #         print('disk read')
     4 #
     5 #     def write(self):
     6 #         print('disk write')
     7 #
     8 # class Text:
     9 #     def read(self):
    10 #         print('text read')
    11 #
    12 #     def write(self):
    13 #         print('text write')
    14 #
    15 # # f=open()
    16 # # f.read()
    17 # # f.write()
    18 #
    19 # disk=Disk()
    20 # text=Text()
    21 #
    22 # disk.read()
    23 # disk.write()
    24 #
    25 # text.read()
    26 # text.write()
    27 
    28 # 序列类型:有序:列表list 元组tuple 字符串str
    29 # 同一种事物的三种形态 只要是序列类型 就可以__len__
    30 l = list([1,2,3])
    31 t = tuple(('a','b','c'))
    32 s = str('hello')
    33 
    34 # print(l.__len__())
    35 # print(t.__len__())
    36 # print(s.__len__())
    37 
    38 # def len(obj):  # 内置
    39 #     return obj.__len__()
    40 
    41 print(len(l))
    42 print(len(t))
    43 print(len(s))
  • 相关阅读:
    【Mysql学习笔记】浅析mysql的binlog
    HBase 学习笔记---守护进程及内存调优
    字符集例子-同一字符不同字符集编码不同及导入导出的乱码
    随机访问
    格式化的代价
    读写文本文件
    缓冲
    加速I/O的基本规则
    序列化再探讨
    数据库I/O:CMP、Hibernate
  • 原文地址:https://www.cnblogs.com/alice-bj/p/8540650.html
Copyright © 2020-2023  润新知