《python基础教程》笔记之 更加抽象

  • 方法、函数和特性

函数和方法的区别在于self参数,方法(绑定方法)将它们的第一个参数帮顶到所属的实例上,因此这个参数可以不必提供。可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数了,换言之,特性可以绑定到方法上,也可以绑定到函数上,两者的区别便是方法将自己绑定到了一个实例上,如

>>> class Class:

    def method(self):

        print 'I have'

>>> def function():

    print 'i do not'

>>> instance = Clas()

>>> instance = Class()

>>> instance.method()

I have

>>> instance.method = function

>>> instance.method()

i do not

self参数并不取决于调用方法的方式,目前使用的是实例调用方法,可以随意使用引用同一个方法的其他变量,换言之,self参数的传入,并不仅仅是在实例调用方法时发生,如果方法被其它变量引用,而此变量在使用时,self参数同样会自动传入,如

>>> class Bird:

    song = 'hello'

    def sing(self):

        print self.song



>>> bird = Bird()

>>> bird.sing()

hello

>>> birdsong = bird.sing

>>> birdsong()

hello
  • 私有化的技巧 

为了让方法或者特性变为私有,只要在它的名字前面加上双下划线即可,而在类的内部定义中,这些名字都被“翻译”成前面加上单下划线和类名的形式;或者使用单下划线,也会有一些实际效果,如不能被带星号的imports语句(from module import *)导入。

  • 类的命名空间

类的定义其实就是执行代码块,所有位于class语句中的代码都在特殊的命名空间中执行 --- 类命名空间,如

>>> class C:

    print 'Class C being defined ...'



Class C being defined ...

>>> class MemberCounter:

    member = 0

    def init(self):

        MemberCounter.member += 1



>>> m1 = MemberCounter()

>>> m1.init()

>>> MemberCounter.member

1

>>> m2 = MemberCounter()

>>> m2.init()

>>> MemberCounter.m

>>> MemberCounter.member

2
  • 面向对象模型相关

草图步骤:

1. 写下问题的描述(程序要做什么?),把所有名词、动词和形容词加下划线

2.对于所有名词,用作可能的类

3.对于所有的动词,用作可能的方法

4.对于所有的形容词,用作可能的特性

5.把所有方法和特性分配到类

精炼模型:

1.写下(或者想象)一系列的使用实例----也就是程序应用时的场景,试着包括所有的功能

2.一步步考虑每个使用实例,保证模型包括所有需要的东西。如果有些遗漏的话就添加进来。如果某处不太正确则改正。继续,直到满意为止。

  • 其他

将其它类名写在class语句后的圆括号内可以指定超类,如

#Filter是个用于过滤序列的通用类,事实上它不能过滤任何东西

class Filter:

    def init(self):

        self.block = []

    def filter(self, sequence):

        return [x for x in sequence if x not in self.block]

#SPAMFilter是Filter的子类,可以将序列中的“SPAM”过滤

class SPAMFilter(Filter):#SPAMFilter 是 Filter的子类

    def init(self):#重写Filter超类中的init方法

        self.block = ['SPAM']

结果

>>> f = Filter()

>>> f.init()

>>> f.filter([1,2,3])

[1, 2, 3]

>>> s = SPAMFilter()

>>> s.init()

>>> s.filter(['SPAM', 'egg', 'bacons', 'SPAM''SPAM''SPAM''SPAM'])

['egg', 'bacons', 'SPAMSPAMSPAMSPAM']

 

issubclass -- 查看一个类是否是另一个类的子类

__bases__  -- 获得已知类的基类们

isinstance  -- 检查一个对象是否是一个类的实例

__class__ -- 知道一个对象属于哪个类

hasattr -- 检查所需的方法是否已经存在

getattr -- 获取对象特性

setattr -- 设置对象的特性

 

你可能感兴趣的:(python)