参考廖雪峰的python教程
廖雪峰的python教程
继承和多态
python也是一门面向对象的语言,自然也会有class
,值得惊喜的是,和java
,javascript
中的类较为相似,学起来轻车熟路。
多态的好处就是,当我们需要传入
Dog、Cat、Tortoise……
时,我们只需要接收Animal类型就可以了,因为Dog、Cat、Tortoise……都是Animal
类型,然后,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思:
对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:
对扩展开放:允许新增Animal子类;
对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。
对于开闭原则的解释,是一种设计模式:
开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。
1.开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;
2.开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。
实例属性和类属性
1.实例属性
class Student(object):
def __init__(self, name):
self.name = name
s = Student('Bob')
s.score = 90
像这种都是绑定的实例属性,类比js里的构造函数constructor()
里的 都是给实例绑定属性
2.当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。
class Student(object):
name = 'Student'
实例属性的get和set方法
我的理解是类的私有方法,在调用getter
或者setter
设置实例属性时会自动调用,比如b.d=
这就是调用了set
下面这段代码就是实现了dict
类
class Dict(dict):
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Dict' object has no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
d = Dict(a=1, b=2)
print (d['a'])
print (d.a) #调用类中原本没有定义的属性时候,调用__getattr__
d.a = 100 #对实例的属性进行赋值的时候调用__setattr__
print (d['a'])