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(...))

#框架

#设计模式

评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用