zoukankan      html  css  js  c++  java
  • python基础5-面向对象编程

    1.类和对象之封装
    #方法1
    def Bar():
        print "Bar"
    def Hello(name):
        print "i am %s" %(name)
    

      

     
    #方法2
    class Foo():
        def Bar(self):
            print 'Bar'
        def Hello(self,name):
            print "i am %s" %name
    

      

     
     
    对于数据库的增删改查
    ####方式1
    def fetch(hostname,port,username,password,db):
        #1.连接数据库,并且指定hostname、port、username、password、db
        #2.打开数据库
        #3.操作数据库,向数据库添加内容
        #4.关闭数据库
        pass
    def modify(hostname,port,username,password,db):
        #1.连接数据库,并且指定hostname、port、username、password、db
        #2.打开数据库
        #3.操作数据库,向数据库添加内容
        #4.关闭数据库
        pass
    def remove(hostname,port,username,password,db):
        #1.连接数据库,并且指定hostname、port、username、password、db
        #2.打开数据库
        #3.操作数据库,向数据库添加内容
        #4.关闭数据库
        pass
    def create(hostname,port,username,password,db):
        #1.连接数据库,并且指定hostname、port、username、password、db
        #2.打开数据库
        #3.操作数据库,向数据库添加内容
        #4.关闭数据库
        pass
     
     
    #将列表添加到数据库
    create([11,22,33])
    

      

     
    利用函数式编程,每一次都要将hostname、port、username、password、db传进去然后进行操作
     
    ####方式2
    #封装:就是变一些变量封装到内存地址里面
    #下面我们使用类来实现数据库的增删查改
     
    class Foo:
    #这个__init__()称为构造方法,当类实例化的时候就执行
    #与函数式编程不同:
        ##将hostname、port、username、password、db封装到self变量里面,
        ##当类里面的方法要用到这些参数时,我们直接传self传进去即可,而不用每次1个1个参数传进去
     
        def __init__(self,hostname,port,username,password,db):
            self.hostname = hostname
            self.port = port
            self.username = username
            self.password = password
            self.db = db
        #
        def fetch(self):
            pass
        def remove(self):
            pass
        def create(self):
            pass
        def modify(self):
            pass
     
    obj1 = Foo(hostname,port,username,password,db)
    obj1 = Foo(1.1.1.1,port,username,password,db)
    obj2 = Foo(2.2.2.2,port,username,password,db)
     
    obj1.create()
    obj1.create()
     
    

      

     
     
    整个流程:
         1.创建Foo类,
         (
              1.这个步骤包括3步:
                   1.创建Foo类
                   2.创建构造函数,将后续要用到的参数封装到self里面;
                   3.然后创建一系列的方法
         )
         2.用类Foo创建obj1对象,即将Foo类实例化
         (
              1.这个过程包括了2步操作 :
                       1.将字段hostname、port、username、password、db_name通过Foo(args)传进去,这些字段就被封装到obj1中;
                       2.然后创建类对象指针,类对象指针指向内存中的Foo类
         )
         3.当执行obj.create(self)方法时,即调用obj对象中的create(args)方法,
            (
               1.这个过程包括2步操作:
                   1.通过obj对象中的类对象指针找到Foo类中,并调用Foo类中的create()方法
                   2.返回到obj对象中,取出obj对象中的hostname、port、username、password、db_name字段
                   3.将取到的这些字段传到类中的create()方法中,执行即可
           )
     
    注意:
         1.对象只封装字段和类对象指针
         2.通过对象来执行类中的方法
     
    2.面向对象之继承
             
         0.怎么使用继承,为什么要使用继承?
    #1.方法1
    class cat:
        def eat(self):
            pass
        def cry(self):
            pass
        def drink(self):
            pass
        def walk1(self):
            pass
    class dog():
        def eat(self):
            pass
        def cry(self):
            pass
        def drink(self):
            pass
        def walk2(self):
            pass
    

      

     
    #方法2:
    class animal:  #基类
        def eat(self):
            pass
        def cry(self):
            pass
        def drink(self):
            pass
     
    class dog(animal):  #派生类,继承父类animal
        def walk2(self):
            pass
     
    class cat(animal):  #派生类,继承父类animal
        def walk1(self):
            pass
    

      

     
          1.经典类和新式类
              ##python其实开始只有函数式编程--->然后又有了初级类和对象进行编程--->然后又有了高级类和面向对象编程
                                                                                     *****经典类******          *****新式类*****
            经典类:
               
     class C:
              pass
    

      

            新式类:
               
     class C(object):
             pass
      或
      class C(object):
             pass
      class D(C):
            pass
    

      

         【注意:python3.0只支持新式类,java、c#只能继承1个类,不支持继承多个,而python可以继承多个类】
     
       2.新式类和经典类在多继承中的区别(B、C都继承D)
                   1.新式类在定义中会在基类或其子类中定义继承object这个类,然而经典类不会定义继承object。
                   2.新式类在执行多继承,会采用广度优先策略,然而经典类采用深度优先策略。(B、C都继承D才是使用深度优先)
                        
                        
     
     
    那么什么时候使用面向对象编程呢?
        1.多个方法要使用同一个变量或多个变量时采用面向对象编程,即在构造函数中封装
        2.当通过模板创建1类东西时才使用面向对象编程
     
     
    ##类成员:实际上就是类里面的方法和字段、属性,统称为类的成员
     
     
    为什么会定义属性:就是把方法伪造、修饰成1个字段,
     
    #属性与方法的区别:
        1.属性在定义时要在上方加装饰器,即@property
        2.属性调用时不用加括号,即obj.attribute
        3.属性是方法的1种,只是我们对方法进行改造,然后访问调用的时候以字段的形式访问
     
    示例:
    class Person(object):
        def __init__(self):
            self.name = name
            self.age = age
     
        def func(self):  #这是定义方法
            return "123"
     
        @property
        def attribute(self):   #这才是定义属性
            return "123"
     
    obj = Person('jachy',21)
    obj.attribute  #调用属性
    obj.func()   #调用方法
    

      

    ***静态字段和普通字段的区别:
    1.静态字段保存在类里面
    2.普通字段保存在对象里面
    如下图:
     
    示例:
    class Person(object):
        name = "jachy"   #这种就是静态字段,保存在类中
        def __init__(self,name,age):
            self.name = name   #这种就是普通字段,保存在对象之中
            self.age = age
     
    obj = Person("lilin",21)
    obj.name  #访问普通字段 ,通过对象来访问
    Person.name  #访问静态字段,通过类来访问
    

      

     
    #类方法、静态方法、普通方法
     
    class Province(object):
        def __init__(self):
            pass
        def f1(self):  #定义普通方法,调用时将对象obj赋给self
            pass
        @classmethod   #定义类方法:用classmethod来装饰
        def f2(cls):  #参数用cls而不用self,cls全称是class,调用时将自身Province赋给cls(只能用cls参数)
            pass
    

      

     
        #类里面定义静态方法=====函数
     
       @staticmethod  #定义静态方法,用@staticmethod来修饰
        def f3(arg1,arg2):  #定义静态方法,参数可以随便写
            pass
     
    #普通方法的访问
    obj=Province()
    obj.f1()  #触发者是对象obj
     
    #类方法的访问
    Province.f2()  #触发者是类Province
     
    #静态方法的访问
    Province.f3()  #触发者是类Province
    

      

     
     
    类方法和静态方法(他们俩访问时无需创建对象,其调用者是类;而普通方法访问是必须创建对象,其调用者是对象)
        1.类方法里面只能传1个参数
        2.静态方法相当于是函数
     
     
     
    属性(python熟悉用得非常少,因为它不太完善,新式类中才使用属性)
    为什么要有属性?为了把方法伪造、“修饰”成1个字段,只能有1个self参数
     
              定义属性的2种表达方式:1.通过装饰器来设置属性;2.直接执行property(func)方法
     
    **********定义属性:方法1***************
    class Pager:
        def __init__(self,current_page):
            self.current_page = current_page
            self.per_items = 10
     
        @property
        def start(self):
            val = (current_page - 1) * self.per_items
            return val
     
        @property
        def end(self):
            val = self.current_page * self.per_items
            return val
    

      

     
    图1:定义属性的方式1
    ###########调用######################
    p = Pager(3)
    p.start   #调用属性
    p.stop    #调用属性
    """
    在连接数据库中时采用属性来定义范围
    select * from a limit p.start:p.stop
    """
     
    ********定义属性:方式2************
    ##分2步:
         1.在即定义1个方法get_bar()
         2.在定义1个变量,如这里BAR = property(get_bar),将方法的指针或地址传给property()即可
     
    class Foo:
        def get_bar(self):
            return "jachy"
        BAR = property(get_bar)   #给get_bar方法定义装饰器
     
    #调用
    obj = Foo()
    result = obj.BAR
    print result
    图2:定义属性的方式2
     
     
     
     
    在类后面加括号和在对象后面加括号的区别?
         1.在对象后面加括号,如obj()表示调用对应类中的__call__方法
          2.在类后面加括号,如Foo("jachy")表示实例化1个类
    图1:
    图2:
     
     
     
    __dict__函数的使用
    图1.对象名.__dict__的使用(写cmdb的使用常用):其实就是输出对象内部的字段并以字典的形式保存下来
    图2:类名.__dict__的使用:其实就是输出类里面存储的字段或方法
     
     
    __str__函数的使用
    图1:当没有定义__str__方法时,直接输出obj对象,其实就是输出obj对象在内存中的地址
     
    图2:当在类中定义了__str__方法之后,输出对象obj就是调用obj对象对应类中的__str__方法的返回值
  • 相关阅读:
    Intent.ACTION_TIME_TICK 广播
    Android ContentObserver
    android:duplicateParentState属性解释
    Android CursorAdapter
    android AndroidManifest.xml 多个android.intent.action.MAIN (
    PreferenceActivity详解
    WORD和WPS中英文混合的内容间距离很大怎么办?
    Android 屏幕适配
    OC第四课
    PL/SQL联系oracle成功可以sql解决的办法是检查表的名称无法显示
  • 原文地址:https://www.cnblogs.com/jachy/p/5040138.html
Copyright © 2011-2022 走看看