• 面向对象相关知识点及常见的操作


    概述:

    • 面向过程:根据业务逻辑从上到下写垒代码
    • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
    • 面向对象:对函数进行分类和封装,让开发“更快更好更强...

     面向对象的三大特征:封装、继承、多态

    封装:即将实现某些功能的代码封装到类中,在使用时通过实例化调用即可

    class Role(object):
        def __init__(self,name,role,weapon,life_value=100,money=1500):
            self.name=name
            self.role=role
            self.weapon=weapon
            self.life_value=life_value
            self.money=money
    
        def buy_gun(self,weapon):
            self.weapon=weapon
            print("%s buy a new [%s]"%(self.name,weapon))
    
    
    #r1为类的对象,即类的实例化过程,self实例本身,Role类本身
    r1=Role("Alex","Police","AK47")
    r1.buy_gun("B11")
    print("r1的weapon的是:",r1.weapon)
    View Code

    如上述例子,首先建立角色类,在类中定义相关属性和常用操作,然后通过类来创建实例对象,并将类的属性和方法随对象的创建而复制

    继承:面向对象中的继承和现实中的继承类似,即子类可以继承父类的所有内容

    继承的宗旨是让具有相同属性和方法的一类事物抽象出来,进行属性和方法定义,然后针对特殊的属性和方法,单独定义,为了让其具有与其他类相关的属性,则让其继承其父类的属性和方法:即:将多个类共同的属性和方法提取到父类中,子类只需定义特殊的属性和方法

     1 #继承
     2 #本例子中给出父类变量的使用及父类方法的调用方法
     3 class SchoolMember(object):
     4     total=0      #父类静态变量,用来统计学校的总人数(教师、学生)
     5     def __init__(self,name,age):
     6         self.name=name
     7         self.age=age
     8     def tell(self):
     9         print("My name is [%s],I'm [%s] years old"%(self.name,self.age))
    10 
    11 
    12 class Teacher(SchoolMember):
    13     """ 教师类 """
    14     def __init__(self,name,age,salary,course):
    15         SchoolMember.__init__(self,name,age)       #父类属性的继承
    16         self.salary=salary
    17         self.course=course
    18         SchoolMember.total+=1       #父类静态变量的继承
    19     def tell(self):
    20         SchoolMember.tell(self)     #父类方法的继承
    21         print("I'm a teacher,Salary:%s,Course:%s"%(self.salary,self.course))
    22 
    23 class Student(SchoolMember):
    24     """ 学生类 """
    25     def __init__(self,name,age,classs):
    26         SchoolMember.__init__(self,name,age)
    27         self.classs=classs
    28         SchoolMember.total+=1
    29     def tell(self):
    30         SchoolMember.tell(self)
    31         print("I'm a student,Class:%s"%self.classs)
    32 
    33 t1=Teacher("Alex","18","20000","python")
    34 s1=Student("Eric","20","s12")
    35 
    36 t1.tell()
    37 s1.tell()
    38 print("学校总人数为:",SchoolMember.total)

    上述代码中,给出了python中典型的继承,包含父类属性、方法及静态变量的继承;

    多继承:

    问题:是否能实现多继承?

    答:python可以实现多继承,即一个类继承多个类

    问题:如果继承的多个类中每个类都有相同的函数,则调用哪一个函数呢?

    答:python的类分为经典类(class FOO)和新式类(class FOO())

    经典类中:深度优先查找,即先查找第一个继承的类,然后查询该类的父类是否有该方法,即:儿子有问题先找爸爸,爸爸没找到则去找爷爷

    新式类中:广度优先查找,即先查找第一个继承的类,没有找到则查询第二个继承的类,若仍旧没找到,则查找继承类的父类,即儿子有问题,找完爸爸找妈妈,实在不行再找爷爷

    多态:

    Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”。

    先看Java和C#中的多态的伪代码

     1 class F1:
     2     pass
     3 
     4 
     5 class S1(F1):
     6 
     7     def show(self):
     8         print 'S1.show'
     9 
    10 
    11 class S2(F1):
    12 
    13     def show(self):
    14         print 'S2.show'
    15 
    16 
    17 # 由于在Java或C#中定义函数参数时,必须指定参数的类型
    18 # 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
    19 # 而实际传入的参数是:S1对象和S2对象
    20 
    21 def Func(F1 obj):
    22     """Func函数需要接收一个F1类型或者F1子类的类型"""
    23     
    24     print obj.show()
    25     
    26 s1_obj = S1()
    27 Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show
    28 
    29 s2_obj = S2()
    30 Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

    python的“鸭子”类型

     1 class F1:
     2     pass
     3 
     4 
     5 class S1(F1):
     6 
     7     def show(self):
     8         print 'S1.show'
     9 
    10 
    11 class S2(F1):
    12 
    13     def show(self):
    14         print 'S2.show'
    15 
    16 def Func(obj):
    17     print obj.show()
    18 
    19 s1_obj = S1()
    20 Func(s1_obj) 
    21 
    22 s2_obj = S2()
    23 Func(s2_obj) 
    • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
    • 类 是一个模板,模板中包装了多个“函数”供使用
    • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
    • 面向对象三大特性:封装、继承和多态
  • 相关阅读:
    《Effective C#中文版:改善C#程序的50种方法》读书笔记
    WPF总结
    定义集合属性(WPF)
    c#只读字段和常量的区别,以及静态构造函数的使用 .
    编程方法的参数
    关于事件的点滴总结
    线程间的消息(或数据)传递
    OOP的感悟
    VS2010快捷键大全----养成良好的习惯
    UTF-8里包括GB2312
  • 原文地址:https://www.cnblogs.com/eric8899/p/6048285.html
Copyright © 2020-2023  润新知