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)

     多态:

     
     
     
  • 相关阅读:
    weblogic无需用户名密码启动Server
    中文和unicode互转
    spring集成activeMQ
    jvm分析(MD语法)
    解决java.lang.NoClassDefFoundError: org/apache/log4j/Level
    httpclient 支持代理和http & https
    容器配置jndi Tomcat为例
    java https tomcat 单双认证(含证书生成和代码实现) 原创转载请备注,谢谢O(∩_∩)O
    java Http原生 Get 和Post 支持代理认证
    解决客户端访问https报错
  • 原文地址:https://www.cnblogs.com/yangever/p/5830604.html
Copyright © 2011-2022 走看看