继承:子类会从父类获得所有的功能(方法)。当子类中有相同的方法时,会调用子类中的方法。
判断某种数据类型时可以用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)