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

时间:2023-03-09 08:33:36
《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 -- 设置对象的特性