继承
定义
子类继承父类的属性并可以拥有自己的属性
使用
class Person(object):
def __init__(self
, name
, gender
):
self
.name
= name
self
.gender
= gender
def who(self
):
return 'I am a Person, my name is %s' % self
.name
class Student(Person
):
def __init__(self
, name
, gender
, score
):
super(Student
, self
).__init__
(name
, gender
)
self
.score
= score
def who(self
):
return 'I am a Student, my name is %s' % self
.name
class Teacher(Person
):
def __init__(self
, name
, gender
, subject
):
super(Teacher
, self
).__init__
(name
, gender
)
self
.subject
= subject
def who(self
):
return 'I am a Teacher, my name is %s' % self
.name
teacher
= Teacher
('Tom', 'Male', 'English')
print teacher
.name
print teacher
.gender
print teacher
.subject
print isinstance(t
, Person
)
print isinstance(t
, Student
)
print isinstance(t
, Teacher
)
print isinstance(t
, object)
class Boss(Person
):
def __init__(self
, name
, gender
,company
):
super(Boss
, self
).__init__
(name
, gender
)
self
.company
= company
'''多态
在实际调用的时候,会首先查找自身的定义,如果自身有定义,则优先使用自己定义的函数;如果没有定义,则顺着继承链向上找。
'''
p
= Person
('Tim', 'Male')
s
= Student
('Bob', 'Male', 88)
t
= Teacher
('Alice', 'Female', 'English')
b
= Boss
('Bob', 'Male', 'Alibaba')
print p
.who
()
print s
.who
()
print t
.who
()
print b
.who
()
'''多重继承
除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。多重继承和单继承没有特别大的差异,只是在括号内加入多个需要继承的类的名字即可。
'''
class A(object):
def __init__(self
, a
):
print ('init A...')
self
.a
= a
class B(A
):
def __init__(self
, a
):
super(B
, self
).__init__
(a
)
print ('init B...')
class C(A
):
def __init__(self
, a
):
super(C
, self
).__init__
(a
)
print ('init C...')
class D(B
, C
):
def __init__(self
, a
):
super(D
, self
).__init__
(a
)
print ('init D...')
'''获取对象信息
type():获得对象类型
dir():获取变量的所有属性
getattr():获取对象的属性
setattr(key, value[, default]):设置对象的属性
'''
特殊方法
以双下划线开头以双下划线结束每个对象都有特殊方法
'''__str__(),___repr__()
Python 定义了__str()__和__repr__()两种方法,__str()__用于显示给用户,而__repr__()用于显示给开发人员,当使用str()时,实际调用的是__str__()方法,而直接输入变量,调用的是__repr__()方法。
'''
class Student():
def __init__(self
, name
, gender
, score
):
self
.name
= name
self
.gender
= gender
self
.score
= score
def __str__(self
):
return 'Student: {}, {}, {}'.format(self
.name
, self
.gender
, self
.score
)
def __repr__(self
):
return 'Student: {}, {}, {}'.format(self
.name
, self
.gender
, self
.score
)
s
= Student
('Bob', 'Male', 80)
print s
print str(s
)
'''__len__()
通过自定义__len__()方法,可以让len()函数返回相关的结果,如果没有定义__len__()方法的类使用len()函数获取长度时,将会引起异常。
'''
class Fib():
def __init__(self
, n
):
self
.count
= n
num
= [0,1]
for i
in range(2,n
):
num
.append
(num
[i
-1]+num
[i
-2])
self
.num
= num
def __repr__(self
):
return str(self
.num
)
def __len__(self
):
return self
.count
print Fib
(10)
print len(Fib
(10))
''‘数学运算
Python的除法可以分为地板除和普通除法,地板除的特殊方法是__floordiv__(向下取整),普通除法是__truediv__(在
2.x版本中则是__div__函数)
'''
class Rational(object):
def __init__(self, p, q):
self.p = p
self.q = q
def __add__(self, r):
return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
def __sub__(self, r):
return Rational(self.p * r.q - self.q * r.p, self.q * r.q)
def __mul__(self, r):
return Rational(self.p * r.p, self.q * r.q)
def __div__(self, r):
return Rational(self.p * r.q, self.q * r.p)
def __str__(self):
return '{}/{}'.format(self.p, self.q)
r1 = Rational(1,2)
r2 = Rational(2,3)
print r1+r2 # ==> 7/6
print r1-r2 # ==> -1/6
print r1*r2 # ==> 2/6
print r1/(r2) # ==> 3/4
'''__slots__
()
__slots__的目的是限制当前类所能拥有的属性,避免因为外部属性的操作导致类属性越来越难以管理
'''
class Person(object):
__slots__ = ('name', 'gender')
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Student(Person):
__slots__ = ('score',)
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
p = Person('John', 'Male')
s = Student('Marry', 'Female', 80)
print p.name # ==> John
print s.score # ==> 80
'''__call__
()
通过实现__call__方法将一个类实例变成可调用对象
'''
class Fib():
def __init__(self
):
pass
def __call__(self
, n
):
num
= [0,1]
for i
in range(2,n
):
num
.append
(num
[i
-1]+num
[i
-2])
return num
f
= Fib
()
print f
(10)