zoukankan      html  css  js  c++  java
  • 面向对象(初级篇)

    一. 面向对象代码如何编写
    面向对象编程需要使用"""对象"来实现, 面向对象编程就是对"""对象"的使用
    类: 就是一个模板,模板里可以包含多个函数, 函数实现一些功能
    对象: 就是根据模板创建的实例, 通过实例对象可以执行类中的函数
    
    
    class Foo:   # 创建类
        def Bar(self):  #创建类中的函数, 在类中定义的函数叫方法
            pass
    obj = Foo()  #根据类创建对象obj
    创建对象就是在类Foo() 的后面加括号即可
    
    
    class Foo:
        def bar(self):
            print("bar")
    
        def hello(self,name):
            print("i am %s" % name)
    
    根据类Foo 创建对象obj
    obj = Foo()     # 创建对象
    obj.bar()      # 通过对象调用方法bar
    obj.hello("alex") # 通过对象调用方法hello
    
    总结
    面向对象: 创建对象 ---> 通过对象执行方法
    
    
    
    二. 面向对象三个特征:封装, 继承,  多态(了解)
    1. 封装:
        将内容封装在某处
        从某处调用被封装的内容
    
    先封装:
    class Foo:
    
        def __init__(self,name,age):  #构造方法
            self.name = name
            self.age = age
    
    根据Foo创建对象
    自动执行Foo 类的__init__方法
    obj1 = Foo("张三",20)   # 将 "张三" 和 "20" 分别封装在 obj1 和 self 的name 和 age 属性中
    obj2 = Foo("李四",22)   # 将 "李四" 和 "22" 分别封装在 obj1 和 self 的name 和 age 属性中
    
    self是一个形式参数, 当执行 obj1 = Foo("张三",20)的时候, self = obj1
                        当执行 obj2 = Foo("李四",22)的时候, self = obj2
    所以内容其实被封装在了对象 obj1 和obj2 里面了, 每个对象里面都有 name 和age属性
    
    
    再调用:
    被调用有两种情况:
        通过对象直接调用
        通过self 间接调用
    
    直接调用:
    class Foo:
    
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
    obj = Foo("alex",22)
    print(obj.name)
    print(obj.age)
    
    通过self 间接调用被封装的内容:
    class Foo:
    
        def __init__(self,name,age):
            self.name = name
            self,age = age
    
        def detail(self):
            print(self.name)
            print(self.age)
    
    obj = Foo("alex", 22)
    obj.detail()# Python默认会将obj1传给self参数,即:obj1.detail(obj1),
    所以,此时方法内部的 self = obj,即:self.name 是 alex ;self.age 是22
    
    总结:面向对象的封装就是使用构造方法(__init__方法)将内容封装到对象中,
    然后通过对象直接或者 self间接获取被封装的内容
    
    2. 继承
    ########################1. 基本使用 ###########################
    
    ##### 基本写法
    """
    class SuperBase:
        def f3(self):
            print('f3')
    
    class Base(SuperBase):  # 父类,基类
        def f2(self):
            print('f2')
    
    class Foo(Base):        # 子类,派生类
    
        def f1(self):
            print('f1')
    
    obj = Foo()
    obj.f1()
    obj.f2()
    obj.f3()
    # 原则:现在自己类中找,么有就去父类
    """
    
    分别为猫和狗创建一个类
    class 猫:
    
        def 喵喵叫(self):
            print '喵喵叫'
    
        def 吃(self):
            # do something
    
        def 喝(self):
            # do something
    
        def 拉(self):
            # do something
    
        def 撒(self):
            # do something
    
    class 狗:
    
        def 汪汪叫(self):
            print '喵喵叫'
    
        def 吃(self):
            # do something
    
        def 喝(self):
            # do something
    
        def 拉(self):
            # do something
    
        def 撒(self):
            # do something
    吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次
    如果使用继承 可以如下
    class 动物:
    
        def 吃(self):
          # do something
    
        def 喝(self):
          # do something
    
        def 拉(self):
          # do something
    
        def 撒(self):
          # do something
    
    # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
    class 猫(动物):
    
        def 喵喵叫(self):
            print('喵喵叫')
    
    # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
    class 狗(动物):
    
        def 汪汪叫(self):
            print('wangwang叫')
    
    总结: 对于面向对象的继承而言,就是将多个类共有的方法提取到父类中, 子类仅需继承父类的就行
    
    class Parents: #父类
        def func(self): #父类的方法
            pass
    
    class children: #子类  子类继承父类,有父类中的所有方法
        pass
    
    zi = children() #创建子类对象
    zi.func() #调用父类中的方法
    
    
    #练习
    """
    class Base:
        def f1(self):
            print('base.f1')
    
        def f3(self):
            self.f1() # obj是那一个类(Foo),那么执行方法时,就从该类开始找.
            print('base.f3')
    
    class Foo(Base):
        def f1(self):
            print('foo.f1')
    
        def f2(self):
            print('foo.f2')
            self.f3()  # obj是那一个类(Foo),那么执行方法时,就从该类开始找.
    
    
    obj = Foo()
    obj.f2()  # obj是那一个类(Foo),那么执行方法时,就从该类开始找.
    # foo.f2
    # foo.f1
    # base.f3
    
    obj2 = Base()
    obj2.f3()
    # base.f1
    # base.f3
    """
    # 总结: self是哪个类的对象,那么就从该类开始找(自己没有就找父类)
    
    
    如果是多继承呢? (先继承左边的,再继承右边的)
    ########################2. 多继承 ###########################
    """
    class Base1:
        def show(self):
            print('Base1.show')
    
    class Base2:
        def show(self):
            print('Base2.show')
    
    class Foo(Base1,Base2):
        pass
    
    obj = Foo()
    obj.show()
    """
    # 左边更亲
    
    class Base1:
        def f1(self):
            print('base1.1')
        def f2(self):
            print('base1.f2')
    
    class Base2:
        def f1(self):
            print('base2.f1')
    
        def f2(self):
            print('base2.f2')
    
        def f3(self):
            print('base2.f3')
            self.f1()
    
    class Foo(Base1,Base2):
    
        def f0(self):
            print('foo.f0')
            self.f3()
    # 1. 多继承先找左边
    # 2. self到底是谁,self是那个类的对象,那么就从该类开始找(自己没有就找父类)
    obj = Foo()
    obj.f0()
    #结果
    # foo.f0
    # base2.f3
    # base1.1
    
    
    
    class Base:
        def f1(self):
            print('base.f1')
    
    class Foo(Base):
        def f3(self):
            print('foo.f3')
    
        def f2(self):
            print('foo.f2')
            self.f3() # obj是那一个类(Foo),那么执行方法时,就从该类开始找.
    
    obj = Foo()
    obj.f2() # obj是那一个类(Foo),那么执行方法时,就从该类开始找.
    #结果
    # foo.f2
    # foo.f3
    
    
    3. 多态: 指的是一种事物有多重形态
    动物有多种形态: 人, 狗, 猫
    import abc
    class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
        @abc.abstractmethod
        def talk(self):
            pass
    
    class People(Animal): #动物的形态之一:人
        def talk(self):
            print('say hello')
    
    class Dog(Animal): #动物的形态之二:狗
        def talk(self):
            print('say wangwang')
    
    class Pig(Animal): #动物的形态之三:猫
        def talk(self):
            print('say miaomiao')
  • 相关阅读:
    Two Sum
    Longest Common String
    Maximum Subarray
    Copy List with Random Pointer
    Convert Binary Search Tree to Doubly Linked List
    Fast Power
    Centos7安装ELK Cyrus
    IPv6实验 OSPFv3
    IPv6笔记和实验 RIPng
    IPv6 ICMPv6笔记
  • 原文地址:https://www.cnblogs.com/kenD/p/9543627.html
Copyright © 2011-2022 走看看