Python: 类,继承和多态

Class in Python

python中的class定义与cpp相类似,我们在此不多展开。直接上例子:

class Animal(object):
    def __init__(self,name,age):
        self.name = name;
        self.__age = age;
    def greeting(self):
        print("Greetings from {} when he is {} years old".format(self.name,self.__age));

animal = Animal('Jack',2)
animal.greeting()
print(animal.name)

输出结果为:

Greetings from Jack when he is 2 years old
Jack

对上述程序做一个简单的说明:

class关键字来声明一个类,Animal是类名,(object)表示该类是从哪一个类继承而来的,python中所有的类都是从object类继承而来的。

__init__对象的初始化方法,其中的第一个参数永远都是self,其相当于c++中的构造函数。不管是__init__还是后面的greeting都有一个共同特点,即其第一个参数都是self,即指向实例本身,也就是和实例绑定的函数,从这个角度说,往往被称作是方法而不是函数。

注意到__agename在命名上多了两个前置__说明__age不能被访问,相当于c++中的私有变量,如果此时我们使用:

print(animal.__age)

将会得到错误输出:

AttributeError                  
Traceback (most recent call last)
<ipython-input-21-62278dea1cc3> in <module>
----> 1 print(animal.__age)

AttributeError: 'Animal' object has no attribute '__age'

但其值却可以在greeting()方法中被调用,这点也和cpp一致:私有成员变量不能被直接访问,但可以被成员函数访问。

继承

现在我们想创造出来一个Dog类出来,其框架与Animal类几乎一样,我们就可以利用继承派生:

class Dog(Animal):
    def greeting(self):
        print("Ummmmm")
>>>GoodDog = Dog('Jack',2)
>>>print(GoodDog.name)
>>>GoodDog.greeting()

输出结果如下:

Jack
Ummmmm

显然Dog类继承了Animal类的数据与方法,并根据具体情况对其中的greeting()方法进行了修改。

多态

cpp类似,python当中也存在多态的概念,即:

基类与派生类中存在同名方法,在调用函数时会根据传入的实参类型来确定具体调用哪一个类对应的方法。但和c++不同的是,python里的多态做了极大的简化:多态不需要声明虚函数,也不需要为指向基类的派生类指针\引用。下面,我们结合一个小程序来具体说明:

class Animal(object):
    def __init__(self,name,age):
        self.name = name;
        self.__age = age;
    def greeting(self):
        print("Greetings from {} when he is {} years old".format(self.name,self.__age));
class Dog(Animal):
    def greeting(self):
        print("Ummmmm")
def greet(Animal):
    Animal.greeting()
def greet_(Dog):
    Dog.greeting()
>>>Gooddog = Dog('Jack',2)
>>>animal = Animal('Rose',1)
>>>greet(Gooddog)
>>>greet(animal)
>>>greet_(animal)
>>>greet_(Gooddog)

输出结果为:

Ummmmm
Greetings from Rose when he is 1 years old
Greetings from Rose when he is 1 years old
Ummmmm

可以看到,Gooddoganimal分别对应不同的类,对他们调用greet()或者greet_()方法,将会作出不同的相应,这就是多态的魅力。

References

  • [1] http://funhacks.net/explore-python/Class/inheritance_and_polymorphism.html
  • [2] https://www.cnblogs.com/feeland/p/4419121.html

你可能感兴趣的:(python学习)