类:封装、继承、多态。以及如何判别实例的类型,和与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中,访问的级别分为public
,protected
,private
和default
。而在Python中只有public
和private
两种。如果一个成员没有修饰,那么它就是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中声明在类中的成员供所有实例访问和修改。