zoukankan      html  css  js  c++  java
  • python之路,day6-面向对象

    一、面向过程编程

    简单的说就是:如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程的方式是极好的,但是如果你要处理的任务比较复杂,且需要不断迭代和维护的,那还是用面向对象最方便了。

    二、面向对象编程

    class:类

    一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法。

    Object:对象

    一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同

    Encapsulation 封装
    在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法

    Inheritance 继承
    一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承

    Polymorphism 多态
    态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
    编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。
    对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
    多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定

    “类”例:

    class Role(object):
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
     
        def shot(self):
            print("shooting...")
     
        def got_shot(self):
            print("ah...,I got shot...")
     
        def buy_gun(self,gun_name):
            print("just bought %s" %gun_name)
     
    r1 = Role('liudong','police','AK47’) #生成一个角色
    r2 = Role('Jack','terrorist','B22’)  #生成一个对上面的代码进行解释:class Role(object): #定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法,必须这样写,以后再讲为什么
       def__init__(self,name,role,weapon,life_value=100,money=15000): #初始化函数,在生成一个角色时要初始化的一些属性就填写在这里
            self.name = name 
    #__init__中的第一个参数self,和这里的self都 是什么意思? 看下面解释
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money  

    r1= Role('Alex','police','AK47’) #生成一个角色 , 会自动把参数传给Role下面的__init__(...)方法
    r2 = Role('Jack','terrorist','B22’)  #生成一个角色
     
    r1 = Role('liudong','police','AK47’) #此时self 相当于 r1 ,  Role(r1,'liudong','police','AK47’)
    r2 = Role('Jack','terrorist','B22’)#此时self 相当于 r2, Role(r2,'Jack','terrorist','B22’)
     

    封装:

    class Role(object):
        a='liudong'
        b='test'
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.__life_value = life_value
            self.money = money
    
        def shot(self):
            print("shooting...")
    
        def life_status(self):
            print("name:%s  weapon:%s  life_val:%s" % (self.name,
                                                       self.weapon,
                                                       self.__life_value
                                                            ))
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name))
    r1 = Role('liudong','police','AK47',)#生成一个角色
    r1.a=1
    r2 = Role('Jack','terrorist','B22',)#生成一个角色
    r2.b=2
    del r2.b
    
    r2.got_shot()
    r2.buy_gun('ak47')
    print(r1.a,r2.a,r1.money,)
    print(r1.life_status())
    print(r1.b,r2.b)

    继承:

    class people():
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def piao(self):
            print("----------------")
    class man(people):
        def piao(self):
            people.piao(self)
            print("%s is piaoing.........." % self.name)
    m1=man("hehe",22)
    m1.piao()

    多集进程:

    # py3-经典类和新式类都是-广度优先   py2-经典类是按-深度优先------新式类是按-广度优先
    
    class School(object):
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
            self.students=[]
            self.staffs=[]
        def enroll(self,stu_obj):
            print("为学员%s 办理注册手续" % stu_obj.name)
            self.students.append(stu_obj)
        def hire(self,staff_job):
            self.staffs.append(staff_job)
            print("雇佣新员工%s" %staff_job.name)
    class SchoolMember(object):
        def __init__(self,name,age,sex):
            self.name = name
            self.age=age
            self.sex=sex
        def tell(self):
            pass
    class Teacher(SchoolMember):
        def __init__(self,name,age,sex,salary,course):
            super(Teacher,self).__init__(name,age,sex)
            self.salary=salary
            self.course=course
        def tell(self):
        def teach(self):
            print("%s is teaching course [%s]" %(self.name,self.course))
    class Student(SchoolMember):
        def __init__(self,name,age,sex,stu_id,grade):
            super(Student,self).__init__(name,age,sex)
            self.stu_id=stu_id
            self.grade=grade
        def tell(self):
            print('''
             ----------------------------------------------------
            Name:%s
            Age:%s
            Sex:%s
            Stu_id:%s
            Grade:%s
            ''' % (self.name, self.age, self.sex, self.stu_id, self.grade))
        def pay_tuition(self,amount):
            print("%s has paid tution for $%s"% (self.name,amount))
    
    school = School("老男孩IT","沙河")
    t1 = Teacher("Oldboy","56","M","20000000","linux")
    t2 = Teacher("刘东","23","M","100000000000","python")
    
    s1 = Student("张三","20","F","1001","pythonDevops")
    s2 = Student("李四","18","M","1002","linux")
    
    t1.tell()
    s1.tell()
    school.hire(t1)
    school.enroll(s1)
    school.enroll(s2)
    
    print(school.students)
    print(school.staffs)
    school.students[0].teach()
    
    for stu in school.students:
        stu.pay_tuition(5000)
  • 相关阅读:
    设计模式——单例模式的一种比较好的写法
    设计模式——观察者模式
    Java中的注解原来是这么用的
    TCP三次握手 四次挥手
    Mat转IplImage IplImage转Mat
    《Android开发艺术探索》读书笔记——Cha3.2.2使用动画实现View的滑动
    11第十二天DBUtils
    Java中几种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)
    10第十一天JDBC事务控制管理
    09重点复习
  • 原文地址:https://www.cnblogs.com/liuyansheng/p/5819092.html
Copyright © 2011-2022 走看看