• python之面向对象


    面向对象与面向过程:

    举个例子:

    加入要去吃烤鱼,

    面向过程:自己动手,从买鱼,洗鱼洗菜,烤鱼,加调料等..                            

    面向对象:来到烤鱼店,店菜单,吃,结账走人

    所以总结如下:

    面向过程:根据业务逻辑从上到下写代码

    函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

    面向对象:对函数进行分类和封装,让开发速度更快

    一. 创建类和对象

       在python中,用变量去表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是"类",对象则是这一类事物中具体的一个

      1.1 类的作用:属性引用和实例化

      如以下代码:

    class Person:    # 定义一个类class
        couty = "china"   # 类属性,静态属性
    
        def __init__(self, *args): # 
            # self 类似于一个字典   
            print(self.__dict__) # {}
            self.name=name   #  
    
        def walk(self):
            print("zou")

    print(Person.couty) # 查看类的属性
    print(Person.walk)   # 查看类的方法

    属性引用(类名.属性)

    实例化:类名加括号,会触发_init_函数的运行,可以用它来为每个实例定制自己的特征

    实例化的过程就是类----》对象的过程

    语法:对象名=类名(参数)

    egg = Person('xiaohei')  #类名()就等于在执行Person.__init__()
    #执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。

    查看属性&调用方法: 

    print(egg.name)   # 查看属性  对象名.属性名
    print(egg.walk()) # 调用方法:对象名.方法名()

    关于self:在实例化时自动将对象/实例本身传给_init_的第一个参数,可以起和别的名字,但正常人都不会这么改的

      1.2 对象:

    class Person:  # 定义一个人类
        role = 'person'  # 人的角色属性都是人
    
        def __init__(self, name, aggressivity, life_value):
            self.name = name  # 每一个角色都有自己的昵称;
            self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;
            self.life_value = life_value  # 每一个角色都有自己的生命值;
    
        def attack(self,dog):  
            # 人可以发起攻击,这里被攻击的也是一个对象
            dog.life_value -= self.aggressivity

      对象是关于类而实际存在的一个例子,即实例  

      对象/实例只有一种作用:属性引用

    xiaohei = Person('xiaohei',10,1000)  # 根据类Person创建对象xiaohei
    print(xiaohei.name)                  
    print(xiaohei.aggressivity)
    print(xiaohei.life_value)

      引用动态属性

    print(egg.attack)

    面向对象的固定模式

    class 类名:
        def __init__(self,参数1,参数2):
            self.对象的属性1 = 参数1
            self.对象的属性2 = 参数2
    
        def 方法名(self):pass
    
        def 方法名2(self):pass
    
    对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                      #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                      #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                      #结果返回一个对象
    对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
    对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

    二. 面向对象三大特性

    1.封装

    封装,就是将内容封装到某个地方,以后再去调用被封装在某处的内容

    # 创建类
    class Boo:
        def __init__(self, name, age):  # 构造方法,根据类创建对象时自动执行4
            self.name = name
            self.age = age
    
        # 通过self间接调用被封装的内容
        def datail(self):
            print(self.name)
            print(self.age)
    
    
    # 根据类Boo创建对象
    # 自动执行Boo类的_init_方法
    obj1 = Boo("xiaohei", 18)  # 将xiaohei和18分别封装到obj的name和age属性中
    # print(obj1.name)          # 调用obj1对象的name属性
    # print(obj1.age)           # 调用obj1对象的age属性
    
    obj1.datail()  ## Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18
    
    obj2 = Boo("xiaoming", 20)
    # print(obj2.name)
    # print(obj2.age)
    obj2.datail() 

    2.继承

    继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容,将多个类共有的方法提取到父类中,子类仅需继承父类而不必实现每个方法

    class Animal:
    
        def eat(self):
            print("%s 吃 " % self.name)
    
        def drink(self):
            print("%s 喝 " % self.name)
    
        def shit(self):
            print("%s 拉 " % self.name)
    
        def pee(self):
            print("%s 撒 " % self.name)
    
    
    class Cat(Animal):
    
        def __init__(self, name):
            self.name = name
            self.breed = ''
    
        def cry(self):
            print('喵喵叫')
    
    
    class Dog(Animal):
    
        def __init__(self, name):
            self.name = name
            self.breed = ''
    
        def cry(self):
            print('汪汪叫')
    
    
    # ######### 执行 #########
    
    c1 = Cat('小白家的小黑猫')
    c1.eat()
    
    c2 = Cat('小黑的小白猫')
    c2.drink()
    
    d1 = Dog('胖子家的小瘦狗')
    d1.eat()

    打印结果如下:

    class 父类:
        def 父类中的方法(self):
            pass
    
    
    class 子类(父类):  # 子类继承父类,即拥有了父类的所有方法
        pass
    
    
    zilei = 子类()  # 创建子类对象
    zilei.父类中的方法()  # 执行从父类中继承的方法

    2.1多继承

    python中类可以继承多个类,java和C#只能继承一个类

    python的类如果继承多个类,寻找的方法有两种,分别是深度优先和广度优先

    • 当类是经典类时,多继承情况下,会按照深度优先方式查找      A---->B---->D----->C
    • 当类是新式类时,多继承情况下,会按照广度优先方式查找   A----->B---->C----->D

                              

     3.多态

      多态的概念是用于Jave和C#语言上的,而python则崇尚"鸭子类型"

      所谓多态:定义时的类型和运行时的类型不一样,此时就是多态

      python伪代码实现Java或C#的多态

    class F1(object):
        def show(self):
            print 'F1.show'
    
    class S1(F1):
        def show(self):
            print 'S1.show'
    
    class S2(F1):
        def show(self):
            print 'S2.show'
    
    # 由于在Java或C#中定义函数参数时,必须指定参数的类型
    # 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
    # 而实际传入的参数是:S1对象和S2对象
    
    def Func(F1 obj):
        """Func函数需要接收一个F1类型或者F1子类的类型"""
    
        print obj.show()
    
    s1_obj = S1()
    Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show
    
    s2_obj = S2()
    Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

    python的"鸭子类型"

    鸭子类型:函数/方法可以接受一个任意类型的对象作为参数/返回值,只要该对象实现了代码后续用到的属性和方法就不会报错

    代码如下:

    class F1(object):
        def show(self):
            print 'F1.show'
    
    class S1(F1):
    
        def show(self):
            print 'S1.show'
    
    class S2(F1):
    
        def show(self):
            print 'S2.show'
    
    def Func(obj):
        print obj.show()
    
    s1_obj = S1()
    Func(s1_obj) 
    
    s2_obj = S2()
    Func(s2_obj)
  • 相关阅读:
    springboot搭建环境访问Controller层返回404
    SpringMVC使用注解@RequestMapping映射请求
    Redis数据类型
    mysql小结
    将数据四舍五入到十位
    Repeated DNA Sequences
    Reverse Linked List II
    Shortest Palindrome
    Single Number
    Sort Colors
  • 原文地址:https://www.cnblogs.com/xiaolu915/p/10556597.html
Copyright © 2020-2023  润新知