zoukankan      html  css  js  c++  java
  • [Python笔记]第十一篇:面向对象

    以上就是本节对于面向对象初级知识的介绍,总结如下:

    • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
    • 类 是一个模板,模板中包装了多个“函数”供使用
    • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
    • 面向对象三大特性:封装、继承和多态

    面向对象基础

    什么是面向对象

    面向对象有别于传统的面向过程变成,是对一个具体事物的抽象描述,在用编程中的可以提高程序员的工作效率,

    值得一提的是在python里面不想Java等语言强制程序员使用面向对象编程,可以采用面向对象和函数混合的

    方式进行.

    创建类和对象

    下面我们来创建一个最基本的类,这个叫做Foo的类:

    class Foo:
        def __init__(self, name, favor):
            self.name = name    # 普通字段
            self.favor = favor
        def intro(self):
            print("%s like eat %s" % (self.name, self.favor))
    
    # 类创建对象时候就传入了参数 到构造方法
    bob = Foo("Bob", "apple")
    sam = Foo("Sam", "orange")
    
    # 执行类方法时候不需要传参数了
    bob.intro()
    sam.intro()
    

    类名字定义是由class关键字空格加类名字Foo加冒号组成;

    这个类里面有两个def开头的像是函数一样的东西,我们叫做它"方法";

    这个类里面有一个"__init__"的特殊方法我们叫做它"构造方法";

    而另外一个def开头的方法则叫做普通方法;

    类的实例化是有一个对象名字加等号类的名字加上一个括号,括号里面是我们需要传入的参数;

    类的执行是对象名字加一个点加上类里面的方法加一对括号;

    类是对事物的抽象化

    对象是类的实例化

      

    面向对象三大特征

    1.封装

    封装就是:我们定义的类必然要生成不同的对象,封装就是封装那些不重复的类都要使用的字段

    class Foo:
        # 构造方法里面的所有成员叫做普通字段
        # 在根据类创建对象的时候自动执行
        def __init__(self, name, favor):
            self.name = name    # 普通字段
            self.favor = favor
    
    
    # 根据Foo类创造对象
    # 自动执行Foo类的__init__方法
    bob = Foo("Bob", "apple")
    

      

    self 是一个形式参数,当执行 bob = Foo("Bob, "apple") 时,self 等于 bob

                                当执行 sam = Foo("Sam", "orange") 时,self 等于 sam

    所以,内容(name/favor)其实被封装到了对象bob 和 sam 中,每个对象中都有 name 和 age 属性.

    那么封装的内容我们如何调用呢?

      直接调用:通过 对象.方法调用 

    class Foo:
        def __init__(self, name, favor):
            self.name = name    # 普通字段
            self.favor = favor
    
    bob = Foo("Bob", "apple")
    print("%s like eat %s" % (bob.name, bob.favor))
    

      

      间接调用:通过self间接调用内容

    class Foo:
        def __init__(self, name, favor):
            self.name = name    # 普通字段
            self.favor = favor
    
        def show_detail(self):
            print("%s like %s" % (self.name, self.favor))
    
    bob = Foo("Bob", "apple")
    bob.show_detail()
    

      

     有一个同学叫小明,他年龄5岁体重90斤,做一次健身体重减轻,吃一次东西会相应增肥:

    class Person:
        # 构造方法
        def __init__(self, name, age, weight):
            # 普通字段
            self.Name = name
            self.Age = age
            self.Weight = weight
        # 方法
        def chidongxi(self):
            self.Weight += 2
    
        def jianshen(self):
            self.Weight -= 1
    
    p1 = Person('小明', 5, 90)  # 实例化出一个类,包含基本信息(姓名/年龄/体重)
    p1.jianshen()    # 执行健身方法减重
    p1.chidongxi()  # 执行吃东西方法增肥
    p1.chidongxi()
    p1.chidongxi()
    p1.jianshen()
    print(p1.Weight)    # 查看最终体重
    减肥游戏

    2.继承

    单一继承

    狗和猫都属于动物类,动物都有吃东西喝水的动作,然而狗却是汪汪叫,猫是喵喵叫;所以创建狗和猫两个类之前可以创建一个叫做动物的基类,

    让动物拥有吃东西喝水的方法,让狗和猫继承动物的一些基本方法,这样创建其他动物时候就只要创建它们特殊的方法就ok了!

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    class Animals:
        def chi(self):
            print(self.name + "吃东西")
    
        def he(self):
            print(self.name + "喝水")
    
    
    class Dog(Animals):
        def __init__(self, name):
            self.name = name
    
        def jiao(self):
            print(self.name + "旺旺叫")
    
    
    class Cat(Animals):
        def __init__(self, name):
            self.name = name
    
        def jiao(self):
            print(self.name + "喵喵叫")
    
    
    zhaocai = Dog("招财")
    zhaocai.chi()
    zhaocai.he()
    zhaocai.jiao()
    
    
    xiaomi = Cat("小咪")
    xiaomi.jiao()
    单一继承

    所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

    注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

    多继承

    继承的顺序: 查找自身 ---- 继承类(左边----右边)

    经典类/新式类多继承情况下的两种查找顺序:

    • 经典类时,多继承情况下,按照深度优先方式查找
    • 新式类时,多继承情况下,按照广度优先方式查找

     

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    class God:
        def bar(self):
            print 'God.bar'
    
    
    class A(God):
        def ba(self):
            print 'A.bar'
    
    
    class B(God):
        def bar(self):
            print 'B.bar'
    
    
    class C(A):
        def ba(self):
            print 'C.bar'
    
    
    class D(B):
        def ba(self):
            print 'D.bar'
    
    
    class E(C, D):
        def ba(self):
            print 'E.bar'
    
    
    e = E()
    e.bar()
    经典类多继承
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    class God(object):
        def bar(self):
            print 'God.bar'
    
    
    class A(God):
        def ba(self):
            print 'A.bar'
    
    
    class B(God):
        def bar(self):
            print 'B.bar'
    
    
    class C(A):
        def ba(self):
            print 'C.bar'
    
    
    class D(B):
        def ba(self):
            print 'D.bar'
    
    
    class E(C, D):
        def ba(self):
            print 'E.bar'
    
    
    e = E()
    e.bar()
    
    #B.bar
    新式类多继承

    总结:

      python2.7未继承object时(经典类),则深度搜索优先(一条道走到黑).

      python2.7继承object(新式类),则广度搜索优先,顶部(指共同继承一个基类)最后.

      python3里面只有新式类,执行广度优先

    3.多态

     Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

  • 相关阅读:
    SQL Server Audit监控触发器状态
    SQL Server 数据变更时间戳(timestamp)在复制中的运用
    SQL Server 更改跟踪(Chang Tracking)监控表数据
    SQL Server 变更数据捕获(CDC)监控表数据
    SQL Server 事件通知(Event notifications)
    SQL Server 堆表行存储大小(Record Size)
    SQL Server DDL触发器运用
    SQL Server 默认跟踪(Default Trace)
    SQL Server 创建数据库邮件
    SQL Server 跨网段(跨机房)FTP复制
  • 原文地址:https://www.cnblogs.com/yaohan/p/5555164.html
Copyright © 2011-2022 走看看