WEEK6:面向对象编程

  • 面向对象介绍

    • 一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性、共同方法
    • 对象
      一个对象即是一个类的实例化后的实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可有不同的属性。
  • 特性
    • 封装
      在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或者容器,里面包含着类的数据和方法
    • 继承
      一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
      py2 经典类是按深度优先来继承的,新式类是按广度优先来继承的。py3经典类和新式类都是统一按广度优先来继承的
    • 多态
      态是面向对象的重要特性,简单点说“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一件事物表现出的多种形态。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
       1 #class People: #经典类
       2 class People(object): #新式类
       3     def __init__(self,name,age):
       4         self.name=name
       5         self.age=age
       6         self.friends=[]
       7     def eat(self):
       8         print("%s is eating..." %self.name)
       9     def talk(self):
      10         print("%s is talking..." %self.name)
      11     def sleep(self):
      12         print("%s is sleeping..." %self.name)
      13 
      14 class Relation(object):
      15     def make_friends(self,obj):
      16         print("%s is making friends with %s"%(self.name,obj.name))
      17         self.friends.append(obj) #不能使用obj.name,否则obj的name修改之后不能同步到朋友列表中
      18 
      19 #子类1
      20 class Man(People,Relation): #多类继承,继承顺序为从左到右依次继承
      21     #添加新变量
      22     def __init__(self,name,age,money):
      23         #People.__init__(self,name,age) #此方法在多继承的时候无法使用
      24         #或者使用下面方法继承父类参数
      25         super(Man,self).__init__(name,age)
      26         self.money=money
      27         print("%s 一出生就有 %s money"%(self.name,self.money))
      28 
      29     def piao(self):
      30         print("%s is piaoing...20s...done" %self.name)
      31     #给父类方法添加新功能
      32     def sleep(self):
      33         People.sleep(self) #保留父类的方法
      34         print("man is sleeping")
      35 #子类2
      36 class Woman(People,Relation):
      37     def get_birth(self):
      38         print("%s is born a baby..."%self.name)
      39 
      40 #子类1的实例
      41 m1=Man("NiuHanYang",22,10)
      42 m1.eat()
      43 m1.piao()
      44 m1.sleep()
      45 
      46 #子类2的实例
      47 w1=Woman("ChenRonghua",26,)
      48 w1.get_birth()
      49 
      50 m1.make_friends(w1)
      51 print(m1.friends[0].name)

       

  • 语法
    • 属性
    • 方法
    • 构造函数
    • 析构函数
      在实例释放、销毁(或删除变量)的时候自动执行的,通常用语做一些收尾工作,例如关闭一些数据库连接、关闭打开的一些临时文件等
    • 私有方法、私有属性
    • 类变量
      大家共用的属性,节省开销
    • 实例变量
       1 #定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法,必须这样写
       2 class Role(object):
       3     #类变量
       4     n=123
       5     name="我是类name"
       6     n_list=[]
       7 
       8     #初始化函数,在生成一个角色时要初始化的一些属性就填写在这里
       9     def __init__(self, name, role, weapon, life_value=100, money=15000):
      10         #构造函数:在实例化时做一些类的初始化工作
      11         self.name = name #实例变量(静态属性),作用域就是实例本身
      12         self.role = role
      13         self.weapon = weapon
      14         self.__life_value = life_value #私有属性,格式为__xxx,对外隐藏,类内可见
      15         self.money = money
      16 
      17     #析构函数,函数名为__xxx__,程序执行完毕之后再执行
      18     def __del__(self):
      19         print("%s 彻底死了....." %self.name)
      20 
      21     #类的方法,功能(动态属性)
      22     def show_status(self):
      23         print("name:%s weapon:%s life_val:%s"%(self.name,self.weapon,self.__life_value))
      24     def got_shot(self):
      25         print("ah...,I got shot...")
      26     def buy_gun(self, gun_name):
      27         print("%s just bought %s" %(self.name,gun_name))
      28     #私有方法
      29     def __shot(self):
      30         print("shooting...")
      31 
      32 #生成一个角色,即实例化(初始化一个类)
      33 r1 = Role('Alex','police','AK47')
      34 #修改实例变量
      35 r1.name="陈荣华"
      36 print(r1.n,r1.name)
      37 r1.n_list.append("from r1")
      38 #给实例添加新的值
      39 r1.bullet_prove=True
      40 print(r1.n,r1.name,r1.bullet_prove)
      41 #删除实例的属性之一
      42 del r1.weapon
      43 #修改类变量(只影响本实例)
      44 r1.n="改类变量"
      45 print("r1:",r1.n)
      46 #类变量重新赋值(只影响r2)
      47 Role.n="ABC"
      48 
      49 #生成另外一个实例
      50 r2 = Role('Jack','terrorist','B22')
      51 print(r2.n,r2.name)
      52 r2.name="徐良伟"
      53 r2.n_list.append("from r2")
      54 print(r2.n,r2.name,r2.n_list)
      55 print(Role.n_list)

       

    • 继承实例
       1 class School(object):
       2     def __init__(self,name,addr):
       3         self.name = name
       4         self.addr = addr
       5         self.students =[]
       6         self.staffs =[]
       7     def enroll(self,stu_obj):
       8         print("为学员%s 办理注册手续"%stu_obj.name )
       9         self.students.append(stu_obj)
      10     def hire(self,staff_obj):
      11         self.staffs.append(staff_obj)
      12         print("雇佣新员工%s" % staff_obj.name)
      13 
      14 class SchoolMember(object):
      15     def __init__(self,name,age,sex):
      16         self.name = name
      17         self.age = age
      18         self.sex = sex
      19     def tell(self):
      20         pass
      21 
      22 class Teacher(SchoolMember):
      23     def __init__(self,name,age,sex,salary,course):
      24         super(Teacher,self).__init__(name,age,sex)
      25         self.salary = salary
      26         self.course = course
      27     def tell(self):
      28         print('''
      29         ---- info of Teacher:%s ----
      30         Name:%s
      31         Age:%s
      32         Sex:%s
      33         Salary:%s
      34         Course:%s
      35         '''%(self.name,self.name,self.age,self.sex,self.salary,self.course))
      36 
      37     def teach(self):
      38         print("%s is teaching course [%s]" %(self.name,self.course))
      39 
      40 class Student(SchoolMember):
      41     def __init__(self,name,age,sex,stu_id,grade):
      42         super(Student,self).__init__(name,age,sex)
      43         self.stu_id = stu_id
      44         self.grade = grade
      45     def tell(self):
      46         print('''
      47         ---- info of Student:%s ----
      48         Name:%s
      49         Age:%s
      50         Sex:%s
      51         Stu_id:%s
      52         Grade:%s
      53         ''' % (self.name, self.name, self.age, self.sex, self.stu_id, self.grade))
      54     def pay_tuition(self,amount):
      55         print("%s has paid tution for $%s"% (self.name,amount) )
      56 
      57 
      58 school = School("老男孩IT","沙河")
      59 
      60 t1 = Teacher("Oldboy",56,"MF",200000,"Linux")
      61 t2 = Teacher("Alex",22,"M",3000,"PythonDevOps")
      62 
      63 s1 = Student("ChenRonghua",36,"MF",1001,"PythonDevOps")
      64 s2 = Student("徐良伟",19,"M",1002,"Linux")
      65 
      66 
      67 t1.tell()
      68 s1.tell()
      69 school.hire(t1)
      70 school.enroll(s1)
      71 school.enroll(s2)
      72 
      73 print(school.students)
      74 print(school.staffs)
      75 school.staffs[0].teach()
      76 
      77 for stu in school.students:
      78     stu.pay_tuition(5000)

       

    • 多态实例
       1 class Animal:
       2     def __init__(self, name):  # Constructor of the class
       3         self.name = name
       4 
       5     def talk(self):  # Abstract method, defined by convention only
       6         pass #raise NotImplementedError("Subclass must implement abstract method")
       7 
       8     @staticmethod
       9     def animal_talk(obj):
      10         obj.talk()
      11 
      12 class Cat(Animal):
      13     def talk(self):
      14         print('Meow!')
      15 
      16 
      17 class Dog(Animal):
      18     def talk(self):
      19         print('Woof! Woof!')
      20 
      21 
      22 d = Dog("陈荣华")
      23 #d.talk()
      24 
      25 c = Cat("徐良伟")
      26 #c.talk()
      27 #
      28 # def animal_talk(obj):
      29 #     obj.talk()
      30 
      31 Animal.animal_talk(c)
      32 Animal.animal_talk(d)

       

posted @ 2019-05-31 22:31  飞琼君  阅读(106)  评论(0编辑  收藏  举报