zoukankan      html  css  js  c++  java
  • day06 面向对象编程

    面向对象:

    面向对象:
    世界万物,皆可分类
    世界万物,皆为对象
     
    只要是对象,就肯定属于某种品类
    只要是对象,就肯定有属性
     
     
     
     
    特性:

     

    多态:

    一个统一的接口,多种实现
     例如:  一个公司 有程序员,销售,前台,但是他们都属于员工
              老板只需说工作, 那么下面的员工就开始各自的工作,不管你是程序猿,前台 都会各自做各自的事情

     

    定义语法:
     
    #定义一个狗类型
    class  Dog:
              def bulk(self):          #会叫
                    print("汪汪汪")
     
     
    #创建一个狗
    dog1 = Dog()
     
    #创建多个狗:
    dog2 = Dog()
    dog3 = Dog()
     
     
    #就为了传名字
     

    构造函数:
    #在实际化时做一些类的初始化的工作.
     
     

    就是把 r1 这个变量名传进去类里了

    self  就是你创建的对象的变量名

    实践:

     1 class Role:
     2     def __init__(self,name,role,weapon,life_value=100,money=15000):
     3         self.name = name
     4         self.role = role
     5         self.weapon = weapon
     6         self.life_value = life_value
     7         self.money = money
     8     def shot(self):
     9         print("shotting ...")
    10     def got_shot(self):
    11         print("ah .... ,i got shot ...")
    12     def buy_gun(self,gun_name):
    13         print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name))
    14 r1 = Role("Alex","F","ak-47")
    15 r2 = Role("小明","T","m4-a1")
    16 r1.buy_gun("m4")
    17 r2.got_shot()

    运行结果:

    实例变量:
    也就是静态属性:
    方法:
    也就是动态属性

    类变量:

     新加变量:

    默认去找实例变量,找不到实例变量才去找类变量

     r1添加变量,r2 实例化不变,因为是r1 添加变量  

     

    改变类变量,如果实例里没有那个变量,那么就会跟着改变

     

    对于list  会导致所有的改变

     

    实验:
    验证 字符串及其他变量的区别:
     1 class Role:
     2     n = 123
     3     n_lsit = []
     4     def __init__(self,name,role,weapon,life_value=100,money=15000):
     5         self.name = name
     6         self.role = role
     7         self.weapon = weapon
     8         self.life_value = life_value
     9         self.money = money
    10     def shot(self):
    11         print("shotting ...")
    12     def got_shot(self):
    13         print("ah .... ,i got shot ...")
    14     def buy_gun(self,gun_name):
    15         print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name))
    16 r1 = Role("Alex","F","ak-47")
    17 r2 = Role("小明","T","m4-a1")
    18 # r1.buy_gun("m4")
    19 #
    20 # r2.got_shot()
    21 print("r1",r1.n,r1.n_lsit)
    22 print("r2",r2.n,r2.n_lsit)
    23 r1.n = "heh1"
    24 r2.n = "hah2"
    25 print("Class:",Role.n,Role.n_lsit)
    26 r1.n_lsit.append("r11")
    27 print("r1",r1.n,r1.n_lsit)
    28 r2.n_lsit.append("r22")
    29 print("r2",r2.n,r2.n_lsit)
    30 print("Class:",Role.n,Role.n_lsit)
    31 print("r1",r1.n,r1.n_lsit)

    运行结果:

    得出:
    实例变量:  就是每个实例的特有属性
    类变量:     就是大家共用的属性,节省内存开销, 如下两个的区别即是

     

     
     
    析构函数:
    在实例释放、销毁的时候自动执行的,通常用于做一些收尾工作,比如:
         1 关闭数据库连接
         2 关闭打开的临时文件

    写一个:

    如果在这之前就del  那么就会提前执行,也就是这个会在一个实例销毁时执行的

     

    私有属性:
     
    例如生命值,只有自己可以访问,别人不能调用也不能访问:
     
    把这个变量隐藏了,对外不可用

     

    外面想要查看,那么就定义一个函数然后在外面来调用这个函数即可

    当然外面的不能访问,必然不能修改,所以想修改就要在里面定义好修改的方式,如下:

    私有方法:
    同上,把对应的方法前加__ 就不能在外面调用了,只能在里面调用:

     

    实践 私有属性:

     1 class Role:
     2     n = 123
     3     n_lsit = []
     4     def __init__(self,name,role,weapon,life_value=100,money=15000):
     5         self.name = name
     6         self.role = role
     7         self.weapon = weapon
     8         self.__life_value = life_value
     9         self.money = money
    10     def shot(self):
    11         print("shotting ...")
    12     def got_shot(self):
    13         print("ah .... ,i got shot ...")
    14     def show_life_value(self):
    15         print("{_name}'s life value is {_life_value}".format(_name=self.name,
    16                                                              _life_value=self.__life_value))
    17     def buy_gun(self,gun_name):
    18         print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name))
    19 r1 = Role("Alex","F","ak-47")
    20 r2 = Role("小明","T","m4-a1")
    21 r1.buy_gun("m4")
    22 r2.got_shot()
    23 r1.show_life_value()
    24 r2.show_life_value()

    实践 私有方法:
    同上,如果在外面调用此方法就会提示错误:

     

    正确方式就是在类里定义另一个方法来调用这个方法:

     

     1 class Role:
     2     n = 123
     3     n_lsit = []
     4     def __init__(self,name,role,weapon,life_value=100,money=15000):
     5         self.name = name
     6         self.role = role
     7         self.weapon = weapon
     8         self.__life_value = life_value
     9         self.money = money
    10     def shot(self):
    11         print("shotting ...")
    12     def __got_shot(self):
    13         print("ah .... ,i got shot ...")
    14         self.__life_value -= 50
    15     def show_life_value(self):
    16         print("{_name}'s life value is {_life_value}".format(_name=self.name,
    17                                                              _life_value=self.__life_value))
    18     def buy_gun(self,gun_name):
    19         print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name))
    20     def out_shot(self):
    21         print("调用里面的私有方法被射中...")
    22         self.__got_shot()
    23 r2 = Role("小明","T","m4-a1")
    24 r2.out_shot()
    25 r2.show_life_value()

    封装  就是把实现的方式内部用私有方法,私有变量实现
     
    继承  
    写一个大类:
    class People:
     
     
     
    写一个男人:

    增加新功能,并先调用父类方法:

     

    这就等于重构了父类的方法

     创建一个woman:

     实践:

     1 class People:
     2     def __init__(self,name,age):
     3         self.name = name
     4         self.age = age
     5     def eat(self):
     6         print("{_name} is eatting ...".format(_name=self.name))
     7     def sleep(self):
     8         print("{_name} is sleepping ...".format(_name=self.name))
     9 class Man(People):
    10     def piao(self):  #添加新的方法,这个方法只能是这个类来用
    11         print("{_name} can piaoing ...".format(_name=self.name))
    12     def sleep(self):    #修改父类里的方法,添加功能,实现个性化
    13         People.sleep(self)
    14         print("给睡觉添加新的功能")
    15 class Woman(People):
    16     def sheng(self):   #添加新的方法,这个方法只能是这个类来用
    17         print("{_name} can shenghaizi ...".format(_name=self.name))
    18 m1 = Man("小明",22)
    19 w1 = Woman("小花",18)
    20 print("m1")
    21 m1.sleep()
    22 print("w1")
    23 w1.sleep()
    24 print("m1")
    25 m1.piao()
    26 print("w1")
    27 w1.sheng()

    子类中的初始化:
    对构造函数进行重构:

    父类的所有参数都要写一遍,写完后面加自己的初始化变量

     下面功能一样: 更方便一些。当大类修改了后子类不需要修改
     
     
    类:
    新式和经典的区别就是新式和经典的多继承不一样了
     

     多继承,  python  支持,  有的语言支持,有的语言不支持
     
     
     实践:
     
     1 class People:
     2     def __init__(self,name,age):
     3         self.name = name
     4         self.age = age
     5     def eat(self):
     6         print("{_name} is eatting ...".format(_name=self.name))
     7     def sleep(self):
     8         print("{_name} is sleepping ...".format(_name=self.name))
     9 class Action(object):
    10     def make_friends(self,object):
    11         print("{_name} is making from {_obj_name}".format(_name=self.name,
    12                                                       _obj_name=object.name))
    13 class Man(People,Action):
    14     def piao(self):  #添加新的方法,这个方法只能是这个类来用
    15         print("{_name} can piaoing ...".format(_name=self.name))
    16     def sleep(self):    #修改父类里的方法,添加功能,实现个性化
    17         People.sleep(self)
    18         print("给睡觉添加新的功能")
    19 class Woman(People):
    20     def sheng(self):   #添加新的方法,这个方法只能是这个类来用
    21         print("{_name} can shenghaizi ...".format(_name=self.name))
    22 m1 = Man("小明",22)
    23 w1 = Woman("小花",18)
    24 m1.make_friends(w1)

    扩展版:

     
     1 #!/usr/bin/env python3
     2 # Author: Shen Yang
     3 class People:
     4     def __init__(self,name,age):
     5         self.name = name
     6         self.age = age
     7     def eat(self):
     8         print("{_name} is eatting ...".format(_name=self.name))
     9     def sleep(self):
    10         print("{_name} is sleepping ...".format(_name=self.name))
    11 class Action(object):
    12     def make_friends(self,object):
    13         print("{_name} is making from {_obj_name}".format(_name=self.name,
    14                                                       _obj_name=object.name))
    15         self.firends.append(object)
    16     def pay_money(self,object):
    17         print("{_name} giveing {_obj_name} {_money} money".format(_name=self.name,
    18                                                                   _obj_name=object.name,
    19                                                                   _money=self.money))
    20 class Man(People,Action):
    21     firends = []
    22     def __init__(self,name,age,money):
    23         super(Man,self).__init__(name,age)
    24         self.money = money
    25     def piao(self):  #添加新的方法,这个方法只能是这个类来用
    26         print("{_name} can piaoing ...".format(_name=self.name))
    27     def sleep(self):    #修改父类里的方法,添加功能,实现个性化
    28         People.sleep(self)
    29         print("给睡觉添加新的功能")
    30 class Woman(People):
    31     def sheng(self):   #添加新的方法,这个方法只能是这个类来用
    32         print("{_name} can shenghaizi ...".format(_name=self.name))
    33 m1 = Man("小明",22,6800)
    34 w1 = Woman("小花",18)
    35 m1.make_friends(w1)
    36 m1.pay_money(w1)
    37 w1.name ="小花花"
    38 print(m1.firends[0].name)

     
    多继承的顺序问题:
     
    新式类 :
    只继承第一个 的初始化__init__
     
     
     
    构造方法查找顺序:
    1 广度优先  先找同一级的同一级的没有才往更上一级查找
    2 深度优先 查找上级,上级没有就会往更上一级查找
     
     
    python3 中的经典类和新式类都是广度优先:
    python2 的经典类是按 深度优先  继承,新式类是按 广度优先 继承。。。。。。
     
    这就是最大区别
     
     
    object 是所有类的类:
     
    class SchoolMember(object):
     写一个学校,员工,学生的对象程序:
     
     1 #!/usr/bin/env python3
     2 # Author: Shen Yang
     3 #object 是所有类的类:
     4 class School(object):
     5     def __init__(self,name,addr):
     6         self.name = name
     7         self.addr = addr
     8         self.students = []
     9         self.staffs = []
    10     def enroll(self,stu_obj):
    11         print("为{_stu_obj} 办理了入学手续。。。".format(_stu_obj=stu_obj.name))
    12         self.students.append(stu_obj)
    13     def hire(self,staff_obj):
    14         print("雇佣了新员工 {_staff_obj}".format(_staff_obj=staff_obj.name))
    15         self.staffs.append(staff_obj)
    16 class SchoolMember(object):
    17     def __init__(self,name,age,sex):
    18         self.name = name
    19         self.age = age
    20         self.sex = sex
    21     def tell(self):
    22         pass
    23 class Student(SchoolMember):
    24     def __init__(self,name,age,sex,stu_id,grade):
    25         super(Student,self).__init__(name,age,sex)
    26         self.stu_id = stu_id
    27         self.grade = grade
    28     def tell(self):
    29         print('''
    30         ----- info of Student: {_name} -----
    31         Name:{_name}
    32         Age:{_age}
    33         Sex:{_sex}
    34         Stu_id:{_stu_id}
    35         Grade:{_grade}
    36         '''.format(_name=self.name,_age=self.age,_sex=self.sex,_stu_id=self.stu_id,_grade=self.grade))
    37     def pay_tuition(self,amount):
    38         print("{_name} has paid tuition {_amount}".format(_name=self.name,_amount=amount))
    39 class Teacher(SchoolMember):
    40     def __init__(self,name,age,sex,salary,coure):
    41         super(Teacher,self).__init__(name,age,sex)
    42         self.salary = salary
    43         self.coure = coure
    44     def tell(self):
    45         print('''
    46         ----- info of Teacher: {_name} -----
    47         Name:{_name}
    48         Age:{_age}
    49         Sex:{_sex}
    50         Salary:{_salary}
    51         Coure:{_coure}
    52         '''.format(_name=self.name,_age=self.age,_sex=self.sex,_salary=self.salary,_coure=self.coure))
    53     def teach(self):
    54         print("{_name} has teach {_coure}".format(_name=self.name,_coure=self.coure))
    55 #初始化一个学校
    56 school = School("老男孩","沙河")
    57 #初始化两个教师
    58 t1 = Teacher("Oldboy",35,"M",20000,"Linux")
    59 t2 = Teacher("Alex",22,"M",3000,"Python")
    60 #初始化一个学生
    61 s1 = Student("Yang",26,"M",1001,"Python")
    62 #让第一个老师打印信息然后开始教课
    63 t1.tell()
    64 t1.teach()
    65 #让第二个老师打印信息
    66 t2.tell()
    67 #让学生打印信息然后缴费
    68 s1.tell()
    69 s1.pay_tuition(6888)
    70 #学校给学生办理入学手续
    71 school.enroll(s1)
    72 #打印学校学生
    73 print(school.students[0].name)
    74 school.hire(t1)
    75 school.hire(t2)
    76 for i in school.staffs:
    77     print(i.name)

     多态:

     
     
     
  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/yangever/p/5830604.html
Copyright © 2011-2022 走看看