运行的结果是: 我是旺财我在跑….
多态1:在python中,多态是伪多态,方法在定义中需要一个父类的参数,而实际传入是可以传入一个子类。
比如说明(Java工程师) 可以是:(Java Web工程师) (java游戏开发工程师)后面两者相当于是前者的子类。就是多态的一种现象。
#在Java中,所有的最终父类都是Object #在python中也是,一个类没有直接的父类就写入object class Animal(object): #在python中init方法相当于构造器 #参数列表中,第一个位置是第一个默认的叫做self.也就是实例本身,相当于java的this def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def running(self): print("我是" + self.name + "我在跑....") #继承一个类时,将类名放在括号中 class Dog(Animal): pass class Person(object): #打印一个方法 def printAnimal(self,animal): #调用方法 animal.running() #主函数如此定义 if __name__ == '__main__': #创建实例 dog = Dog("旺财",3,"公") dog.running() person = Person() person.printAnimal(dog)运行结果:
上面的的Person部分就是就是多态的一种表现。
多态2:多态的鸭子类型 上面person.printAnimal(dog),传入的dog没有被严格检查。只要在传入的变量中同样含有一个running()的方法。这样话,就可以被调用执行。
具体说明: 方法需要一个animal,然后在方法调用animal的某个方法。 如果用户传入的对象不是animal的子类,但是也有对应的方法也行。
鸭子类型的测试:
#在Java中,所有的最终父类都是Object #在python中也是,一个类没有直接的父类就写入object class Animal(object): #在python中init方法相当于构造器 #参数列表中,第一个位置是第一个默认的叫做self.也就是实例本身,相当于java的this def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def running(self): print("我是" + self.name + "我在跑....") #继承一个类时,将类名放在括号中 class Dog(Animal): pass class Person(object): #打印一个方法 def printAnimal(self,animal): #调用方法 animal.running() class A: def running(self): print("我是a......") #主函数如此定义 if __name__ == '__main__': #创建实例 dog = Dog("旺财",3,"公") dog.running() person = Person() person.printAnimal(dog) #鸭子类型测试 a = A() a.running() person.printAnimal(a)运行结果:
1、如何获取一个变量的类型 Type() 通过type,可以获得是整型,是方法,还是类
通过type,可以看到是方法的类型:
2、如何比较一个变量的类型 查看是否是某种类型:
type(a) type(person) #比较一个类型是否是int r = isinstance(a,int) print(r) r = isinstance(a,str) print(r)3、如何查看一个类有多少方法 使用dir(参数)方法
4、如果查看一个类有多少属性
#主函数如此定义 if __name__ == '__main__': animal = Animal("a","2","sex") #通过getattr方法拿animal对象中对应的age的属性值 r = getattr(animal,"age","默认值") print(r)再如:
sex = getattr(animal,"sex","Ren") if sex == "Ren": setattr(animal,"sex","animal") if hasattr(animal,"sex"): if getattr(animal,"sex") == "animal": print("终于不是人了")