继承一个类
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
判断类型
isinstance()可以判断类型
isinstance(p, Person)
多态
动态语言和静态语言(例如java)的最大差别是,不检查类型,只要方法存在,参数正确,就可以调用。
支持多重继承
获取对象信息
type() # 获取对象类型
dir() # 获取变量所有属性字符串list,可结合filter()获得定制的属性列表
已知屬性名:
getattr(s, 'name')
setattr(s, 'name', 'Adam')
特殊方法
定义在class中,不需要直接调用,Python的某些函数或操作符会调用对应的特殊方法。
__getattr__
__setattr__
__delattr__
__str__ # 给print看的信息
__repr__ # 给开发人员看的信息
__cmp__ #排序用
__len__ #让len()函数正常工作的话,就必须定义此方法,返回元素个数
四则运算:
__add__
__sub__
__mul__
__div__
__int__ #让int()函数工作
__float__ #让float()函数工作
__slots__ #一个类允许的属性列表,即限制当前类所能拥有的属性
class Student(object):
__slots__=('name', 'gender', 'score')
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
__call__ #将实例变爲可调用对象
在Python中,函数其实是一个对象;
所有的函数都是可调用对象;
一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()
例子:把Person类实例变成一个可调用对象:
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __call__(self, friend)
print 'My name is %s...' % self.name
print 'My friend is %s...' % friend
>>> p = Person('Bob', 'male')
>>> p('Tim')
My name is Bob...
My friend is Tim...
对私有属性的访问
用get/set方法来封装对一个属性的访问在许多面向对象编程的语言中都很常见。
但是写s.get_score()和s.set_score()方法没有写s.score来的直接。
可以用装饰器函数
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
@property
def score(self):
return self.__score
@score.setter
def score(self, score):
if score < 0 or score > 100:
raise ValueError('invalid score')
self.__score = score
第一个score(self)是get方法,用@property装饰
第二个score(self, score)是set方法,用@score.setter装饰,是@property装饰后的副产品。
现在就可以像使用属性一样设置score了。