• 面向对象


    什么是面向对象:

    #面向对象
    class SQLHelper:
        def fetch(self, sq1):
            print(sq1)
            print(self.hhost)                #执行被封装的函数hhost
            print(self.uusername)            #执行被封装的函数uusername
            print(self.pwd)                  #执行被封装的函数pwd
        def create(self, sq1):
            pass
        def remove(self, nid):
            pass
        def modify(self, name):
            pass
    obj = SQLHelper()
    obj.hhost = ("cl.star.com")             #代表把参数传入 hhost 中封装
    obj.uusername = ("Guido")               #代表把参数传入 uusername 中封装
    obj.pwd = ("123")                       #代表把参数传入 pwd 中封装
    obj.fetch("select*from A")             #执行对象obj的fetch方法,将封装的参数传入self中,(" ")中的参数传入sq1
    

    什么时候用面向对象:

          当某一些函数具有相同参数时,可以使用面向对象的方式,将参数的值一次性封装在对象里,以后到对象中直接取值。

    self是什么:

          self是一个python会自动传值得形式参数,哪个对象执行该方法,self就是那个对象。

    obj1.fetch("kdi")     self = obj1
    obj2.fetch("kdi")     self = obj2
    

    构造方法:

      类中有一个特殊的方法__init__,类()时对象被建立 __init__就会自动被执行

      这个方法可以用来对你的对象做一些你希望的初始化。注意,这个名称的开始和结尾都是双下划线。

    class SQLHelper:
        def __init__(self, a1, a2, a3):    #封装数据
            print("自动执行__init__")
            self.hhost = a1                #a1 = slkj.com   self = obj1
            self.uusername = a2            #a2 = Guido  self = obj1
            self.pwd = a3                  #a3 = 123    self = obj1
        def fetch(self, sq1):          #sq1 = select*from A
            pass
        def remove(self, nid):
            pass
        def modify(self, name):
            pass
    obj1 = SQLHelper("slkj.com", "Guido", 123)
    obj1.fetch("select*from A")
    

    类与对象的关系:

    两种类型的域——

            类的变量和对象的变量,它们根据是类还是对象拥有这个变量而区分。

    类的变量:由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。

    对象的变量:由类的每个对象(实例)拥有。因此每个对象有自己对这个域的一份拷贝,即他们不是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,但是是互不相关的。

    面向对象的三大特性:

    封装、继承、多态

      封装:

    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)
    class c3:
        def __init__(self, a1):
            self.money = 123
            self.aaa = a1
    c2_obj = c2("aa", 11)                #c2_obj是c2的类,name="aa",age=11
    c1_obj = c1("Guido", c2_obj)         #c1_obj是c1类型,name="Guido",obj=c2_obj
    print(c1_obj.obj.age)
    c3_obj = c3(c1_obj)                  #c1_obj=a1
    print(c3_obj.aaa.name,type(c3_obj.aaa.name))
    

     

    继承:

    面向对象编程带来的好处之一就是代码重用,实现这种方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author:Guido's admirers
    
    
    class We:
        def __init__(self, name):
            self.name = name
    
        def li(self):
            print("TT", self.name)
    
    
    class No(We):
        def __init__(self, age, name):
            We.__init__(self, name)
            self.age = age
    
        def MM(self):
            print("Good", self.name, self.age)
    
    obj = No("guido", 27)
    obj.MM()
    
    
    执行结果:
    Good 27 guido
    

      

    单继承:

    相当于把父类写入子类里

    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")
    obj = F2("Guido")
    obj.show()                       #优先执行本类中的同名方法
    obj.foo()
    
    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()
    obj1 = S1()
    obj1.F1()
    #执行过程中子类中没有的方法去父类里找,父类中与子类中同时有的方法,子类中的方法优先执行。
    

    多继承:

    class c3(c1,c2)

    多态:

    多种形态,多种类型

    def func(arg):
        print(arg)
    func(1)              #对对象进行封装时数据可以是多种类型
    func("Guido")
    func([11, 22, 33])
    

     在:c#与java中没有多态,指定形式参数时要指出参数类型,只能通过类的继承增加多态的形式,类与该类的子类。

    #此代码只做演示便于理解,不是正确的。
    def func(int arg):
        func(123)
        func("Guido")      #报错
        
    class A:
        pass
    class B(A):
        pass
    class C(A):
        pass
    def func(A, arg):    #aeg参数:必须是A类型或A的子类型
        print(arg)
    obj = A(arg)
    func(obj)
    
  • 相关阅读:
    ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
    Atcoder Regular Contest 061 D Card Game for Three(组合数学)
    Solution 「CERC 2016」「洛谷 P3684」机棚障碍
    Solution 「CF 599E」Sandy and Nuts
    Solution 「洛谷 P6021」洪水
    Solution 「ARC 058C」「AT 1975」Iroha and Haiku
    Solution 「POI 2011」「洛谷 P3527」METMeteors
    Solution 「CF 1023F」Mobile Phone Network
    Solution 「SP 6779」GSS7
    Solution 「LOCAL」大括号树
  • 原文地址:https://www.cnblogs.com/Guido-admirers/p/6097022.html
Copyright © 2020-2023  润新知