Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)

1、创建类的代码:

#在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 + "我在跑....")

#主函数如此定义
if __name__ == '__main__':
    #创建实例
    animal = Animal("旺财",3,"公")
    animal.running()

运行的结果是:
我是旺财我在跑….

2、继承

#在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

#主函数如此定义
if __name__ == '__main__':
    #创建实例
    animal = Dog("旺财",3,"公")
    animal.running()

3、多态

多态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)

运行结果:
Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)_第1张图片

上面的的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)

运行结果:
Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)_第2张图片

4、获取类的信息

1、如何获取一个变量的类型
Type()
通过type,可以获得是整型,是方法,还是类

通过type,可以看到是方法的类型:
Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)_第3张图片

2、如何比较一个变量的类型
查看是否是某种类型:

type(a)
    type(person)

    #比较一个类型是否是int
    r = isinstance(a,int)
    print(r)
    r = isinstance(a,str)
    print(r)

Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)_第4张图片

3、如何查看一个类有多少方法
使用dir(参数)方法
Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)_第5张图片

4、如果查看一个类有多少属性

#主函数如此定义
if __name__ == '__main__':
    animal = Animal("a","2","sex")
    #通过getattr方法拿animal对象中对应的age的属性值
    r = getattr(animal,"age","默认值")
    print(r)

Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)_第6张图片

再如:

sex =  getattr(animal,"sex","Ren")
if sex == "Ren":
    setattr(animal,"sex","animal")
    if hasattr(animal,"sex"):
        if getattr(animal,"sex") == "animal":
            print("终于不是人了")

你可能感兴趣的:(#,Python)