• 类、继承和反射


    一、类

    类有自己的变量、函数、方法等,每个类都默认的有构造函数__init__和析构函数__del__,而且在调用的时候默认的先调用构造----一般方法-------析构函数__del__

    #coding=utf-8
    class Person:
         def __init__(self,name,age):
             self.name=name
             self.age=age
             print u'我是类的构造方法'#类实例化的对象,调用类的方法的时候,默认会先调用init,
             # 再调用要调用的方法,最后也会默认调用类的析构方法 __del__
             #实例化类的时候,如果init有参数,那么实例化时要必须带这些参数
         def eat(self):
             print u'我是类的eat方法'
             print 'my name is{0},my age is {1}'.format(self.name,self.age)
    
         def setName(self,name):
             self.name=name
         def getName(self):
             return self.name
         def __del__(self):
             print u'我是类的析构方法'
    per=Person('Lida',20)
    per.eat()
    per.setName('yaya')
    print per.getName()

    运行结果:

    我是类的构造方法
    我是类的eat方法
    my name isLida,my age is 20
    yaya
    我是类的析构方法

    二、python继承的规则  从左到右,由下至上

    1、从左到右指的是一个类class1可以同时继承多个类(class2,class3,class4),在调用类中的方法时,调用顺序为class2---》class3----》class4,示例代码:

    class Animal1(object):
        def grow(self):
            print u'我是第一个Animal类的方法'
        def eat(self):
            print u'开始吃饭'
        def drink(self):
            print u'开始喝水'
    
    class Animal2(object):
        def grow(self):
            print u'我是第二个Anima2类的方法'
    class tiger(Animal2,Animal1):
        def walk(self,name):
            self.name=name
            print u'{0}在走路'.format(self.name)
    ti=tiger()
    ti.grow()
    ti.walk('panda'

    执行结果如下:

    tiger(Animal2,Animal1)运行结果:     
    我是第二个Anima2类的方法-------------#调用Animal2的
    panda在走路 
    
    tiger(Animal1,Animal2)运行结果:
    我是第一 个Anima1类的方法----------------#调用Animal1的
    panda在走路

    2、由下至上指的是如果子类复写了父类的方法,那么在调用的时候,调用的是子类的这个方法,示例代码如下:

    class Animal(object):
        def drink(self):
            print u'Animal开始喝水'
    class Dog(Animal):
        def wang(self):
            print u'小狗汪汪叫'
    class Cat(Animal):
        def miao(self):
            print u'小猫喵喵叫'
        def drink(self):
            print u'小猫在喝水'#子类复写了父类的方法,调用时调子类
    cat=Cat()
    cat.drink()
    cat.miao()
    dog=Dog()
    dog.drink()

    执行结果:

    小猫在喝水
    小猫喵喵叫-------------#Cat复写了父类的drink方法
    Animal开始喝水-------#Dog没有复写,直接调用父类的drink方法

    三、反射

    1、主要用到俩个函数:getattr(x, 'y'):获取对象x的成员y;hasattr(x, 'y'):判断对象x的成员y是否存在


    示例代码3.1:fanshe.py
    #coding=utf-8
    class Obj(object):
        def __init__(self,name):
            self.name=name
        def show(self):
            pass
    obj=Obj('panda')
    
    print "getattr(x, 'y'):获取对象x的成员y:", getattr(obj,'name')
    print "hasattr(x, 'y'):判断对象的成员是否存在:",hasattr(obj,'show')
    
    

    运行结果:

    getattr(x, 'y'):获取对象x的成员y: panda
    hasattr(x, 'y'):判断对象的成员是否存在: True

    2、应用

    示例代码3.2:查看判断3.1中fanshe.py模块中是否存在某个类,存在的话输出其某个元素

    #coding=utf-8
    def exit(modelName,className):
        m=__import__(modelName,fromlist=True)#m是导入的模块
        if hasattr(m,className):
            class_name=getattr(m,className)#获取模块的类
            lei1=class_name('panda')#实例化获取到的类
            print getattr(lei1,'name')
            print hasattr(lei1,'show')
        else :
            print u'模块中不存在这个类'
    exit('fanshe','Obj')

    运行结果如下:

    getattr(x, 'y'):获取对象x的成员y: panda------------------------#导入模块后,程序就开始运行此模块,所以才会输出这俩句
    hasattr(x, 'y'):判断对象的成员是否存在: True-----------------#导入模块后,程序就开始运行此模块,所以才会输出这俩句
    panda
    True

     
  • 相关阅读:
    day20
    day19
    day18
    day17
    day16
    day14 HTML
    day7课程
    day6
    python-day4
    python-day3
  • 原文地址:https://www.cnblogs.com/sunny0/p/7646788.html
Copyright © 2020-2023  润新知