类、继承和反射

一、类

类有自己的变量、函数、方法等,每个类都默认的有构造函数__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

 
原文地址:https://www.cnblogs.com/sunny0/p/7646788.html