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()
 

  

python基础5-面向对象编程
 
 
整个流程:
     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才是使用深度优先)
                    python基础5-面向对象编程
                    python基础5-面向对象编程
 
 
那么什么时候使用面向对象编程呢?
    1.多个方法要使用同一个变量或多个变量时采用面向对象编程,即在构造函数中封装
    2.当通过模板创建1类东西时才使用面向对象编程
 
 
##类成员:实际上就是类里面的方法和字段、属性,统称为类的成员
python基础5-面向对象编程
 
 
为什么会定义属性:就是把方法伪造、修饰成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()   #调用方法

  

python基础5-面向对象编程
***静态字段和普通字段的区别:
1.静态字段保存在类里面
2.普通字段保存在对象里面
如下图:
python基础5-面向对象编程
 
示例:
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基础5-面向对象编程
 
 
属性(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
python基础5-面向对象编程
###########调用######################
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
python基础5-面向对象编程
 
 python基础5-面向对象编程
 
 
在类后面加括号和在对象后面加括号的区别?
     1.在对象后面加括号,如obj()表示调用对应类中的__call__方法
      2.在类后面加括号,如Foo("jachy")表示实例化1个类
图1:
python基础5-面向对象编程
python基础5-面向对象编程
图2:
python基础5-面向对象编程
 python基础5-面向对象编程
 
 
__dict__函数的使用
图1.对象名.__dict__的使用(写cmdb的使用常用):其实就是输出对象内部的字段并以字典的形式保存下来
python基础5-面向对象编程
python基础5-面向对象编程
图2:类名.__dict__的使用:其实就是输出类里面存储的字段或方法
python基础5-面向对象编程
 python基础5-面向对象编程
 
__str__函数的使用
图1:当没有定义__str__方法时,直接输出obj对象,其实就是输出obj对象在内存中的地址
python基础5-面向对象编程
 python基础5-面向对象编程
图2:当在类中定义了__str__方法之后,输出对象obj就是调用obj对象对应类中的__str__方法的返回值
python基础5-面向对象编程
python基础5-面向对象编程