python面向对象的三大特性

前言

Python是面向对象的语言,也支持面向对象编程的三大特性:封装(隐藏)、继承、多态。

一、封装(隐藏)

隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将"细节封装起来",只对外暴露“相关调用方法”。通过私有属性、私有方法的方式实现封装。

Python追求简洁的语法,没有严格的语法级别的"访问控制符",更多的是依靠程序员的自觉实现。

二、继承

如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作难度,已有的类,我们称为"父类或基类",新的类,我们称为“子类或派生类”。

继承可以让子类具有父类的特性,提高了代码的重用性。

Python支持多重继承,一个子类可以继承多个父类,继承的语法格式如下:

class 子类类名(父类1,父类2,…): 类体

类成员的继承和重写:

    成员继承:子类继承了父类除构造方法之外的所有成员。 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类中的方法,也称为重写。
class Person:
    def __init__(self,name,age):
        self.name=name
        self.__age=age
    def say_age(self):
        print("我的年龄是",self.__age)
    def say_introduce(self):
        print("我的名字是{}".format(self.name))
class Student(Person):
    def __init__(self,name,age,score):
        Person.__init__(self,name,age)
        self.score=score
    def say_introduce(self):

        print("我的名字是{}".format(self.name))
s=Student("李四",18,100)
s.say_age()
s.say_introduce()

输出结果: 重写__str__方法:

用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮助我们查看对象的信息。str()可以重写。

class Person():
    def __init__(self,name):
        self.name=name

p=Person("李四")
print(p)

输出结果: str()重写后:

class Person():
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return "名字是:{}".format(self.name)
p=Person("李四")
print(p)

输出结果: 关于多重继承:

Python支持多重继承,一个子类可以有多个“直接父类”,这样就具备了多个父类的特点,但是由于这样会把“类的整体层次”搞得很复杂,尽量避免使用。

class A:
    def aa(self):
        print("aa")
class B:
    def bb(self):
        print("bb")
class C(A,B):
    def cc(self):
        print("cc")
c=C()
c.aa()
c.bb()
c.cc()

输出结果:

三、多态

多态(polymorphism)是指同一个方法调用,由于对象不同可能会产生不同的行为。

注意:

    多态是方法的多态,属性没有多态 多态的存在有两个必要条件:继承、方法重写
class Man:
    def eat(self):
        print("世界和平!")
class Chinese(Man):
    def eat(self):
        print("中国人")

class English(Man):
    def eat(self):
        print("英国人")

class American(Man):
    def eat(self):
        print("美国人")


def manEat(m):
    if isinstance(m,Man):
        m.eat()
    else:
        print("其他人")

manEat(Chinese())
manEat(English())
manEat(American())
#Person这个实例化对象,父类实例化的
Person=Man()
manEat(Person)

输出结果: 一个类它继承了一个类,但是它又改写了它父类的方法,这样在调用这个方法时,就会因为实例对象的不同而调用的方法不同,也就是说看这个实例对象实例化时是用父类实例化的,还是子类实例化的,是父类实例化的,结果就是父类的方法,是子类实例化的,结果就是子类的方法。

经验分享 程序员 微信小程序 职场和发展