zoukankan      html  css  js  c++  java
  • python笔记

                        python笔记 - day7-1 之面向对象编程                      

    什么时候用面向对象:

      多个函数的参数相同;
      当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可;

    self是什么?    

      self是一个python自动会给传值得参数;  
      哪个对象执行方法,self就是哪个对象;
      
    例:
    class SQLHelper:
        def __init__(self,a1,a2,a3):
            print("自动执行")
            self.hhost = a1
            self.uusername = a2
            self.pwd = a3
    
        def fetch(self,sql):
            print(self.hhost)
            print(self.uusername)
            print(self.pwd)
            print(sql)
    
        def create(self,sql):
            print(self.hhost)
            print(self.uusername)
            print(self.pwd)
            print(sql)
    
    obj1 = SQLHelper('C1.SALT.COM','alex',123)
    obj1.fetch("select * from A")
    #如果SQLHelper后面加括号,表示执行SQLHelper的__init__方法;
    #obj1如果执行了__init__方法,self就等于obj1
    #如:
        def __init__(self,a1,a2,a3):
            print("自动执行")
            obj1.hhost = a1
            obj1.uusername = a2
            obj1.pwd = a3
    
    
    obj2 = SQLHelper('www.baidu.com','freddy',123)
    obj2.create("create ........")
    #obj2如果执行了__init__方法,self就等于obj2
    #如:
        def __init__(self,a1,a2,a3):
            print("自动执行")
            obj2.hhost = a1
            obj2.uusername = a2
            obj2.pwd = a3

    构造方法:  

      类中有一个特殊的方法,__init__,类()自动执行;
      创建对象,后面加括号,表示遇到__init__方法,就执行__init__方法;

    面向对象,三大特性:  

      封装,继承,多态;

     “函数式编程”,与“面向对象编程”比较:

    函数式编程:使用函数式编程,如果执行每个函数,都要重新传入参数,比较麻烦:

    def fetch(host,username,password,sql):
        pass
    def create(host,username,password,sql):
        pass
    def remove(host,username,pasword,uid):
        pass
    def modify(host,username,password,name):
        pass
    

     面向对象编程:可以创建一个对象,到时候想要执行哪个方法,调用自己创建的对象即可;

    class SQLHelper:
    def fetch(self,sql): print(self.hhost) print(self.uusername) print(self.pwd) print(sql)
    def create(self,sql): pass

    def remove(self,uid): pass

    def modify(self,name): pass #类里面的方法只能通过对象来调用 obj = SQLHelper() obj.hhost = "www.mysql.com" obj.uusername = "freddy" obj.pwd = '123' obj.fetch("select * from A")

    标准面向对象写法:

    class SQLHelper:
        def __init__(self,a1,a2,a3):
            print("自动执行")
            self.hhost = a1
            self.uusername = a2
            self.pwd = a3
    
        def fetch(self,sql):
            print(self.hhost)
            print(self.uusername)
            print(self.pwd)
            print(sql)
    
        def create(self,sql):
            print(self.hhost)
            print(self.uusername)
            print(self.pwd)
            print(sql)
    
    #这里会把自定义的三个参数,分别传给fetch,create;
    obj1 = SQLHelper('c1.salt.com','alex',123)
    
    #调用上面创建的对象,并执行额外的命令
    obj1.fetch("select * from A")
    
    #调用这个对象,执行额外的命令
    obj1.create("create database aaa")

    取其它对象下面的值:

    class c1:
        def __init__(self,name,obj):
            self.name = name
            self.obj = obj
    
    class c2:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def show(self):
            print(self.name)
            
    c2_obj = c2('aa',11)
    c1_obj = c1("alex",c2_obj)
    
    # - 取出来c2_obj下的age是多少?
    # - c2_obj赋值给c1_obj了,先打印c1_obj,
    # - c2_obj赋值给c1_obj下的obj了,再打印c1_obj.obj,相当于打印的c2_obj
    # - 最后再c2_obj里面取出age的值即可
    
    print(c1_obj.obj.age)

    类之前的方法调用,三个类:

    class c1:
    def __init__(self,name,obj):
    self.name = name
    self.obj = obj

    class c2:
    def __init__(self,name,age):
    self.name = name
    self.age = age

    def show(self):
    print(self.name)
    # return 123

    class c3:
    def __init__(self,a1):
    self.money = 123
    self.aaa = a1

    #如何使用C3类,调用c2类下的show方法?
    c2_obj = c2('freddy',11)
    #c2_obj是c2类型
    # - name = 'aa'
    # - age = 11

    c1_obj = c1("alex",c2_obj)
    #c1_obj是c1类型
    # - name = "alex"
    # - obj = c2_obj
    c3_obj = c3(c1_obj)
    #使用c3_obj找到c2下的name
    print(c3_obj.aaa.obj.age)

    #使用c3_obj执行show方法
    ret = c3_obj.aaa.obj.show()
    print(ret)

    继承:

    class F1:
        def show(self):
            print('show')
    
        def foo(self):
            print(self.name)
    
    class F2(F1):
        def __init__(self,name):
            self.name = name
    
        def bar(self):
            print('bar')
        def show(self):
            print('F2.show')
    
    #F2类下找不到foo方法,就继续去F1下找foo方法,因为F2类继承了F1类;
    #继承就相当于把父类的内容,在子类中创建了一份;
    #子类可以继承父类,父类不能继承子类;
    obj = F2('alex')
    obj.foo()
    
    #F1和F2类里面都有show方法,这里创建对象是F2的类,优先调用F2类下的show方法
    obj = F2('alex')
    obj.show()

    面向对象之单继承:

    class S1:
        def F1(self):
            self.F2()
        def F2(self):
            pass
    
    class S2(S1):
        def F3(self):
            self.F1()
        def F2(self):
            pass
    
    
    obj = S2()
    obj.F3()
    #这里执行的是S2下的F2
    
    obj = S1()
    obj.F1()
    #这里执行的是S1下的F2

    面向对象之多继承,继承都是从底层开始找:

     方法一:最简单的多继承,通过C3继承了C2,C1,通过C3类,可以执行C2,C1里面的方法

    class C1:
        def f1(self):
            print("f1")
    
    class C2:
        def f2(self):
            print("f2")
    
    class C3(C2,C1):
        def f3(self):
            print("f3")
    
    obj = C3()
    obj.f1()
    obj.f2()
    obj.f3()

    方法二:一条道,走到黑,如果父类只有一个子类,就是先去子类找,找不到再往右找;

        查找顺序:C3.f2(没有) → C1.f2(没有) → C0.f2(有,执行),没有就执行C2.f2

    class C0:
        def f2(self):
            print("C0.F2")
    
    class C1(C0):
        def f3(self):
            print("C1.F3")
    
    class C2:
        def f2(self):
            print("C2.f2")
    
    class C3(C1,C2):
        def f3(self):
            print("f3")
    obj = C3()
    obj.f2()
    
    结果:C0.F2

    方法三:如果一个父类,有两个子类,执行顺序:

        C3.f2(没有) → C1.f2(没有) → C0.f2(没有,就不往上找了) → C3.f2(回到原点,没有) → C2.f2(有,执行)

    class C_2:
        def f2(self):
            print("C-2,F2")
    
    class C_1(C_2):
        def f2(self):
            print("C_1.F2")
    class C0(C_2):
        def f3(self):
            print("C0.F2")
    
    class C1(C0):
        def f3(self):
            print("C1.F3")
    class C2(C_1):
        def f2(self):
            print("C2.f2")
    
    class C3(C1,C2):
        def f3(self):
            print("f3")
    
    obj = C3()
    obj.f2()

    看源码必须要懂这个原理:

    执行:obj = A()

       obj.forever()

    A → process() → __init__   【找到init了,obj = A()执行完了,回到原点,开始执行obj.forever() 】

    A → process() → __init__ → __init__ , run(),process() → forever()【找到了,执行这个方法】

    执行:self.run()

      A → process() → __init__ → __init__ , run()【找到了,执行这个方法】

    执行:self.process()

      A → process(),【找到了,执行这个方法】

    这个模块源码,就是引用了上面的方法:

    import socketserver
    
    #加括号,是个函数执行这个函数,
    # 是个类,执行init方法
    obj = socketserver.ThreadingTCPServer()
    
    obj.serve_forever()
  • 相关阅读:
    【UWP】使用Action代替Command
    【UWP】在不同类库使用ResourceDictionaries
    【UWP】不通过异常判断文件是否存在
    【UWP】批量修改图标尺寸
    【UWP】FlipView绑定ItemsSource,Selectedindex的问题
    【UWP】UI适配整理
    【iOS】Object-C注释
    【iOS】desctiption和debugDescription
    【iOS】关联属性存取数据
    【iOS】配置和使用静态库
  • 原文地址:https://www.cnblogs.com/tangshengwei/p/5815642.html
Copyright © 2011-2022 走看看