Python: 类,继承和多态

本文深入探讨Python中的类定义、私有属性、继承与多态概念。通过具体示例,展示了如何创建类、定义初始化方法及私有变量,以及如何通过继承实现代码复用和多态性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值