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
,即指向实例本身,也就是和实例绑定的函数,从这个角度说,往往被称作是方法而不是函数。
注意到__age
和name
在命名上多了两个前置__
说明__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
可以看到,Gooddog
和animal
分别对应不同的类,对他们调用greet()
或者greet_()
方法,将会作出不同的相应,这就是多态的魅力。