第六章: 面向对象
class Person(object): # 继承与object
def this_is_instance_method(self): # self必须写,还可以加入其它参数 实例方法
pass
tom = Person() # tom实例 Person类
tom.this_is_instance_method() # 通过实例访问实例方法
重载____str____ 方法:类似于java toString
•The goal of repr is to be unambiguous.
•The goal of str is to be readable.
方法 (两侧加"__") | 功能说明 |
---|---|
init() | 构造函数,生成对象时调用 |
del() | 析构函数,释放对象时调用 |
add() | + |
sub() | - |
mul() | * |
div()、truediv() | / |
floordiv() | 整除 |
mod() | % |
pow() | ** |
cmp() | 比较运算 |
repr() | 打印、转换 |
setitem() | 按照索引赋值 |
getitem() | 按照索引获取值 |
len() | 计算长度 |
call() | 函数调用 |
contains () | 测试是否包含某个元素 |
eq()、 ne()、lt()、 le()、gt() | ==、!=、<、<=、> |
str() | 转化为字符串 |
lshift() | << |
and() | & |
iadd() | += |
不建议把子类复制粘贴父类的方法,建议先执行父类方法,然后修改定制,好处是便于维护
多态
巧用父类的构造函数和方法。
introspection自省,class知道自己的类名P50
print(instance.__class__) # py自动在类里生成
print(instance.__class__.__name__)
print(instance.__dict__)
getattr–查一下很重要
新式类vs.旧式类
而对于Python 2,类必须继承自object,才是“新式类” l
class MyClass(object): # py2.7 推荐
pass
class MyClass: # py3.5
pass
静态方法static method
要记录由一个类创建的实例对象的数目
(跨实例信息,不属于实例属性)它不仅不传递而且也不期待一个self实例参数(括号里不用写self),
def function(): # this is a static method
pass
function = staticmethod(function) # 生成静态方法,重要 PPT P13
py2必须,而py3对类不必要
类方法
必须预留(cls)
def class_method(cls): # 期待一个类
pass
class_method = classmethod(class_method)
总结
–实例方法(instance method):它期待一个实例对象作为第一个参数。我们把这个参数写作self。通过实例对象调用实例方法时,Python会把实例对象自动传递给第一个参数。而通过类调用时,需要手动传入实例。
–静态方法(static method):它不期待参数,调用时也不需要实例对象作为参数。它通常都是通过类对象来调用。
–类方法(class method):它期待一个类对象作为第一个参数。我们把这个参数写作cls。
装饰器
@staticmethod
def static_method():
pass
super()
Difference between py2 and 3.
super(Sub,self)._init_() # py2
super()._init_() # py3
类的伪私有属性
变量名压缩(name mangling)
# 编译器把变量名self.__x 改为 _ThisClass__x
可以避免类变量名字冲突。
面向对象程序设计思想
OOP三个概念:继承、多态、封装
IS-A Relationship:apple is a fruit——继承
HAS-A Relationship: house has a room——组合&聚合
for cls in Class1, Class2, Class3:
obj = cls(cls._name_)
obj.work
抽象超类(抽象类 abstruct class)
必须要重载
好处:定义在父类,接口与接口的实现分离
多重继承
class multi(Base1, Base2):
iterator
"""
__iter__ 的方法,它返回一个迭代器对象(iterator)
__iter__ 和 __next__ 方法可以同时处于一个类中,在这种情况下,__iter__ 返回 self,我们可以说,这个可迭代对象是自己的迭代器
"""