ch25OOP:宏伟蓝图(python)
#面向对象分解代码,把代码的冗余度降到最低。
#定制现有的代码来编写新的程序,而不是在原处进行修改
#类的建立使用class语句。类的设计是为了创建和管理新的对象,并且支持继承。
#为何使用类:
继承:
组合:
多重实例:
通过继承进行定制:
运算符重载:
#概览OOP:
#属性继承搜索
object.attribute
当类对象使用该表达式时,这个表达式会在python中启动搜搜,搜索对象连接的树,来寻找attribute首次出现的对象。
找attribute首次出现的地方,先搜索object,然后该对象上的所有类,由上至下,从左到右。
#类:实例的工厂
#实例:
超类
子类
#类和实例:在python中类和实例是两种不同的对象类型。
#类方法调用
self关键字
#编写类树:
# Note: all the code in this chapter is abstract -- it won't run as is
class C2: ... # Make class objects (ovals)
class C3: ...
class C1(C2, C3): ... # Linked to superclasses
I1 = C1() # Make instance objects (rectangles)
I2 = C1() # Linked to their classes
#类通过函数(在class语句内由def语句编写而成)为实例提供行为。
# C2 and C3 must exist in the following
class C1(C2, C3): # Make and link class C1
def setname(self, who): # Assign name: C1.setname
self.name = who # Self is either I1 or I2
I1 = C1() # Make two instances
I2 = C1()
I1.setname('bob') # Sets I1.name to bob
I2.setname('mel') # Sets I2.name to mel
print(I1.name) # Prints bob
#def在上面的这样的语境中,通常称为方法,并且自动接收第一个特殊参数,self。
#构造函数
#每次从类产生实例时,python会自动地调用名为__init__的方法。__init__方法就是运算符重载。
#这类方法支持在类树中被继承
#当能够支持通信操作的示例出现在对应的运算时,python就会自动运行他们,而且他们是使用简单方法调用最常用的替代方法。
#这类方法是可选的,省略时,不支持这类运算。
class C1(C2, C3):
def __init__(self, who): # Set name when constructed
self.name = who # Self is either I1 or I2
I1 = C1('bob') # Sets I1.name to bob
I2 = C1('mel') # Sets I2.name to mel
print(I1.name) # Prints bob
#OOP是为了代码重用:
#通过类,我们可以定制现有的软件来编写代码,而不是在原处修改代码。
#定义员工类,有通用行为
class Employee: # General superclass
def computeSalary(self): ... # Common or default behavior
def giveRaise(self): ...
def promote(self): ...
def retire(self): ...
#子类,继承自Employee类,有自己的计算薪水方法
class Engineer(Employee): # Specialized subclass
def computeSalary(self): ... # Something custom here
#创建类实例
bob = Employee() # Default behavior
mel = Engineer() # Custom salary calculator
#多态:运算的意义取决于运算对象。
company = [bob, mel] # A composite object
for emp in company:
print(emp.computeSalary()) # Run this object's version
#多态用于隐藏接口差异性。
def processor(reader, converter, writer):
while 1:
data = reader.read()
if not data:
break
data = converter(data)
writer.write(data)
class Reader:
def read(self): ... # Default behavior and tools
def other(self): ...
class FileReader(Reader):
def read(self): ... # Read from a local file
class SocketReader(Reader):
def read(self): ... # Read from a network socket
...
processor(FileReader(...), Converter, FileWriter(...))
processor(SocketReader(...), Converter, TapeWriter(...))
processor(FtpReader(...), Converter, XmlWriter(...))
#框架
#设计模式
#定制现有的代码来编写新的程序,而不是在原处进行修改
#类的建立使用class语句。类的设计是为了创建和管理新的对象,并且支持继承。
#为何使用类:
继承:
组合:
多重实例:
通过继承进行定制:
运算符重载:
#概览OOP:
#属性继承搜索
object.attribute
当类对象使用该表达式时,这个表达式会在python中启动搜搜,搜索对象连接的树,来寻找attribute首次出现的对象。
找attribute首次出现的地方,先搜索object,然后该对象上的所有类,由上至下,从左到右。
#类:实例的工厂
#实例:
超类
子类
#类和实例:在python中类和实例是两种不同的对象类型。
#类方法调用
self关键字
#编写类树:
# Note: all the code in this chapter is abstract -- it won't run as is
class C2: ... # Make class objects (ovals)
class C3: ...
class C1(C2, C3): ... # Linked to superclasses
I1 = C1() # Make instance objects (rectangles)
I2 = C1() # Linked to their classes
#类通过函数(在class语句内由def语句编写而成)为实例提供行为。
# C2 and C3 must exist in the following
class C1(C2, C3): # Make and link class C1
def setname(self, who): # Assign name: C1.setname
self.name = who # Self is either I1 or I2
I1 = C1() # Make two instances
I2 = C1()
I1.setname('bob') # Sets I1.name to bob
I2.setname('mel') # Sets I2.name to mel
print(I1.name) # Prints bob
#def在上面的这样的语境中,通常称为方法,并且自动接收第一个特殊参数,self。
#构造函数
#每次从类产生实例时,python会自动地调用名为__init__的方法。__init__方法就是运算符重载。
#这类方法支持在类树中被继承
#当能够支持通信操作的示例出现在对应的运算时,python就会自动运行他们,而且他们是使用简单方法调用最常用的替代方法。
#这类方法是可选的,省略时,不支持这类运算。
class C1(C2, C3):
def __init__(self, who): # Set name when constructed
self.name = who # Self is either I1 or I2
I1 = C1('bob') # Sets I1.name to bob
I2 = C1('mel') # Sets I2.name to mel
print(I1.name) # Prints bob
#OOP是为了代码重用:
#通过类,我们可以定制现有的软件来编写代码,而不是在原处修改代码。
#定义员工类,有通用行为
class Employee: # General superclass
def computeSalary(self): ... # Common or default behavior
def giveRaise(self): ...
def promote(self): ...
def retire(self): ...
#子类,继承自Employee类,有自己的计算薪水方法
class Engineer(Employee): # Specialized subclass
def computeSalary(self): ... # Something custom here
#创建类实例
bob = Employee() # Default behavior
mel = Engineer() # Custom salary calculator
#多态:运算的意义取决于运算对象。
company = [bob, mel] # A composite object
for emp in company:
print(emp.computeSalary()) # Run this object's version
#多态用于隐藏接口差异性。
def processor(reader, converter, writer):
while 1:
data = reader.read()
if not data:
break
data = converter(data)
writer.write(data)
class Reader:
def read(self): ... # Default behavior and tools
def other(self): ...
class FileReader(Reader):
def read(self): ... # Read from a local file
class SocketReader(Reader):
def read(self): ... # Read from a network socket
...
processor(FileReader(...), Converter, FileWriter(...))
processor(SocketReader(...), Converter, TapeWriter(...))
processor(FtpReader(...), Converter, XmlWriter(...))
#框架
#设计模式
评论
发表评论