类(Class)是抽象的模板,而实例(Instance)是根据类创建出来的一个个具体的"对象",每个对象拥有相同的方法,而各自的数据不同。
# class关键字定义类,后面object表示Student是从object继承的,
class Student(object):
# 通过定义特殊的__init__方法,在创建类时,将必须绑定的属性强制填写进去
# __init__第一个参数是self,表示实例本身,在内部将name和score属性绑定到self上
def __init__(self, name, score):
self.name = name
self.score = score
def print(self):
print("%s %s" % (self.name, self.score))
# 创建Student实例,必须传入与__init__方法匹配的参数
std = Student("name", 90)
# Student实例将name和score数据封装起来,通过调用实例的方法,操作对象的内部数据
std.print()
上例中,仍可以通过std.name来访问和修改实例的name属性。如果要将name和score内部属性设置为私有变量(private),可以在属性的名称前加两个下划线__,只有内部可以访问,外部不可以访问。如下:
变量名类似__xxx__,前后都有两个下划线的是特殊变量,特殊变量可以直接访问,不是private的。
定义一个新的class可以继承已有的class,从而获得父类的全部功能。例如:
class Animal(object):
def run(self):
print('animal run')
# Cat类继承自Animal类
class Cat(Animal):
# 将父类中的run方法覆写掉
def run(self):
print('cat run')
Cat类也可以覆写run方法,从而代码调用时,会调用子类的run方法。这样,我们会获得了多态。
# 该函数接受Animal类型的变量 >>> def run_twice(animal): ... animal.run() ... animal.run() ... >>> run_twice(Animal()) # 当传入Animal对象时 animal run animal run >>> run_twice(Cat()) # 当传入Cat对象时 cat run cat run
对于传入的不同的Animal子类,run_twice()函数不需要做任何修改,只需要接受Animal类型就可以了。因为Cat等子类也算是Animal类型,然后可以按照Animal的类型进行操作,可以放心的调用run()方法,而具体的run()方法是作用在Animal、Cat对象上,由运行时该对象的确切类型决定。这就是多态的好处:
对扩展开放:允许新增Animal的子类
对修改封闭:不需要修改依赖Animal类型的run_twice()函数
静态语言 vs 动态语言:
对于静态语言(例如Java):如果需要传入Animal类型,则传入的对象必须是Animal类型或它的子类,否则将无法调用run()
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-70754-10.html
谁能告诉我
大东沟海战中
你知道美国在我周边煽动别国闹事