继承与多态

继承:子类会从父类获得所有的功能(方法)。当子类中有相同的方法时,会调用子类中的方法。

判断某种数据类型时可以用isinstance

isinstance(a, list) #判断a是不是一个list类型

如果一个实例是一个子类的类型,那它也一定是父类的类型,反之不成立(父类包含更大,子类分的更细)

多态,只要知道一个实例是父类型(不需要知道准确的子类型)就可以调用实际类型的方法(或者实际类型没有重新定义该方法而是继承父类的,也可以直接调用父类的方法)。方法调用将首先调用子类型的方法,如果没有将会向上沿着继承关系查找。

动态语言,B是非A类类型的类型,但只要B中定义有与A中相同的方法,就可以用同一种方法(外部定义)去调用A、B中方法(属性B.方法名(函数名))

A、

class Teacher(Person):
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course
    def whoAmI(self):
        return 'I am a Teacher, my name is %s' % self.name
B、
class Book(object):
    def whoAmI(self):
        return 'I am a book'

方法、

def who_am_i(x):
    print x.whoAmI()   #为什么我会觉得这是很正常的事

T = Teacher('bart', male, 'English')
B = Book()
who_am_i(T)
who_am_i(B)
#输出
I am a Teacher, my name is bart
I am a book

type(),括号里输入需要判断类型的参数名,如type(abs) type(1) type(func) type('a')

isinstance(A, B),A是需要判断的类型,B是假定的类型,为真返回True

isinstance(A, (list, tuple)),这样使用可以用来判断A是list或者tuple,返回True或者False

hasattr(A, 'y')判断实例A中有y属性(或者方法)吗?

getattr(A, 'y')获得实例A的y属性(或者方法), fn = getattr(A, 'y') 把A属性的方法赋值给fn

setattr(A, 'y', 1)设置实例A的属性为1

点击打开链接
# 首先你有一个command.py文件,内容如下,这里我们假若它后面还有100个方法

class MyObject(object):
    def __init__(self):
        self.x = 9
    def add(self):
        return self.x + self.x

    def pow(self):
        return self.x * self.x

    def sub(self):
        return self.x - self.x

    def div(self):
        return self.x / self.x

# 然后我们有一个入口文件 exec.py,要根据用户的输入来执行后端的操作
from command import MyObject
computer=MyObject()

def run():
    inp = input('method>')

    if inp == 'add':
        computer.add()
    elif inp == 'sub':
        computer.sub()
    elif inp == 'div':
        computer.div()
    elif inp == 'pow':
        computer.pow()
    else:
        print('404')

上面使用了if来进行判断,那么假若我的command里面真的有100个方法,那我总不可能写100次判断吧,所以这里我们就会用到python的反射特性,看下面的代码

from command import MyObject

computer=MyObject()
def run(x):
    inp = input('method>')
    # 判断是否有这个属性
    if hasattr(computer,inp):
    # 有就获取然后赋值给新的变量
        func = getattr(computer,inp)
        print(func())
    else:
    # 没有我们来set一个
        setattr(computer,inp,lambda x:x+1)
        func = getattr(computer,inp)
        print(func(x))

if __name__ == '__main__':
    run(10)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值