MENU

Python学习笔记(六)

2018 年 01 月 05 日 • Python学习笔记

类:封装、继承、多态。以及如何判别实例的类型,和与Java的区别简析

类的定义

类的概念不多赘述,Python中定义类也很简单,需要注意的是类中方法的第一个参数都是self,如下

class Dog():
    
    #构造函数
    def __init(self):
        pass
    
    #类中的方法
    def run(self):
        print('Dog is running')

封装

个人觉得封装是一种思想,一个类中信息哪些需要暴露出来,哪些没有必要暴露出来这些在创建这个类的时候都需要思考的。暴露出来的信息往往通过方法来实现。

继承

如果要继承自父类,只需要在声明的括号中添加父类的类型即可。当父类与子类存在相同的方法时,父类的方法将被覆盖。

class Animal():
    
    def __init(self):
        print('Animal is init...')

    def run(self):
        print('Animal is running')

class Dog(Animal):
    pass

dog = Dog()
dog.run()

Python与Java类的很大不同时Python存在多重继承
比如说这只狗是波士顿动力的那个机器狗,那么它可能有两个父类,一个是动物,一个是机器。

class Animal():
    def __init__(self, name):
        print('%s is init...'% name)

    def run(self):
        print('Animal is running')

class Machine():

    def showBattery(self):
        print('this is battery info')

class Dog(Animal, Machine):
    pass

dog = Dog('Snoopy')
dog.run()
dog.showBattery()

多态

维基百科中这样解释:多态(英语:polymorphism),是指计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作称之。通俗点说就是同一个操作作用在不同的对象上,会有不同的解释(即方法的内容不一样,输出也就不一样)。

在Java语言中多态是基于类或接口的。对于一个方法而言,要达到多态的效果,只有继承了该方法或实现了该接口才能实现。而在Python除了以上的两点(事实上,Python中并未接口一说)之外,它更加宽泛:只要类中实现了该方法即可。

class Dog():

    def run(self):
        print('dog is running')

class Cat():

    def run(self):
        print('car is running')

class Pig():

    def run(self):
        print('pig is running')


def show_run_status(animal):
    animal.run()

dog = Dog()
cat = Cat()
pig = Pig()

show_run_status(dog)
show_run_status(cat)
show_run_status(pig)

将会输出以下结果

dog is running
car is running
pig is running

如何判别一个实例的类型

可以通过isinstance函数进行判别。

访问限制

在Java中,访问的级别分为publicprotectedprivatedefault。而在Python中只有publicprivate两种。如果一个成员没有修饰,那么它就是public的,生成的实例可以对该成员进行访问;而如果以__进行修饰,那么这个成员就是私有的,一般而言不能够通过实例直接进行访问。

class Dog():
    
    def __init__(self,name):
        self.__name = name

    #这个name属性就是私有的,无法通过实例进行直接访问
    def get_name(self):
        return self.__name 

说到类的成员,Python中类的成员可以进行动态增删。比如动态添加个成员,或者删除个成员,但是修改的影响只限于当前实例。

class Dog():

    def __init__(self, name):

        self.__name = name

    def get_name(self):

        return self.__name

dog = Dog('Snoopy')
print(dog.get_name())

#动态添加
dog.color = 'yellow'
print(dog.color)

#动态删除
del dog.color
print(dog.color)

另外与Java中类的静态变量类似,Python中声明在类中的成员供所有实例访问和修改。