python是面向对象的语言。
7.1 对象的魔力
7.1.1 多态
不管是字符串还是列表,count()函数都可以正常工作。
>>> ['ab','b','c'].count('c')
1
>>> 'abc'.count('c')
1
下面的加号 + 运算符对于整数和列表都可以起作用,而且行为不同:
>>> 1 +2
3
>>> 'fsafda' + 'fsdfs'
'fsafdafsdfs'
7.1.2 封装
7.1.3 继承
7.2 类和类型
7.2.1 类到底是什么
7.2.2 创建自己的类
self:类自动的将自己作为第一个参数传递进去,代表对象本身。
self参数事实上正是方法和函数的区别。
>>> class Person: def setName(self, name): self.name = name def getName(self): return self.name def greet(self): print('Hello world ! I am %s' % self.name) >>> foo = Person() >>> bar = Person() >>> foo.setName("jordan") >>> bar.setName('kobe') >>> foo.greet() Hello world ! I am jordan >>> bar.greet() Hello world ! I am kobe
7.2.3 特性、函数和方法
默认情况下,程序可以从外部访问一个对象的特性。
python并不直接支持私有方法。但是有一些小技巧可达到私有特性的效果。
为了让方法或者变量变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可:
幕后是这么做的:以双下划线开始的名字都被翻译成前面加上单下划线和类名的形式,所以还是可以在类的外部调用这些私有方法和变量(这样做不好)。
如果不需要使用这种方法但是又想让其他对象不要访问内部数据,那么可以使用单下划线。这只是个习惯,但有实际效果。例如,前面有下划线的名字都不会被带星号的import语句(from module import *)导入。
7.2.4 类的命名空间
>>> def foo(x): return x*x >>> foo(5) 25 >>> foo2 = lambda x: x*x >>> foo2(5) 25
>>> class C:
print('class C being defined') // 类内部的函数也可以不用def定义,可以直接写执行语句
class C being defined
>>> class MemberCounter: members = 0 //类的作用域中定义了供所有成员访问的变量,用来计算类的成员数量。 def init(self): MemberCounter.members += 1 >>> m1 = MemberCounter() >>> m1.init() >>> MemberCounter.members 1 >>> m2 = MemberCounter() >>> m2.init() >>> MemberCounter.members 2
7.2.5 指定超类
class SPAMFilter(Filter) // 将其他类名写在class语句后的圆括号内可以指定超类。
7.2.6 检查继承
issubclass函数可以检查一个类是否是另外一个类的子类
issubclass(SPAMFilter, Filter) : 判断SPAMFilter是否是Filter的子类。
SPAMFilter.__bases__ : 得到已知类的基类。
isinstance(s, SPAMFilter)
7.2.7 多个超类
class Talkingcalculator(Calculator, Talker) // python允许继承自多个基类,多重继承
多重继承的两个类如果有方法同名,那么先继承的类的方法会覆盖后继承的类的方法。
7.2.8 接口和内省
7.3 一些关于面向对象设计的思考