1.创建类
1 class Person: 2 def setName(self.name): 3 self.name = name 4 5 def getName(self): 6 return self.name 7 8 def greet(self): 9 print("Hello, world! I‘m %s." % self.name)
这里创建了Person类,并在类中定义了三个方法:setName(),getName(),greet()
在调用Person对象foo的setName()和greet()函数时,foo自动将自己作为第一个参数传入函数中,因此形象地命名为self
通过self,成员方法得以访问他们要对其特性进行操作的对象本身
2.特性、函数和方法
self参数正是方法和函数的区别,方法(绑定方法)将它们的第一个参数绑定到所属的实例上,因此这个参数可以不必提供,如果将特性绑定到一个普通函数上,这样就不会有特殊的self参数了
self参数并不取决于调用方法的方式
最后一个方法的调用中,变量birdsong引用绑定方法bird.sing上,这还是对self参数的访问,也就是说,它仍旧绑定到类的相同实例上
私有化
默认情况下,程序可以从外部访问一个对象的特性。但是应该尽量避免从外部直接访问特性,可以使用私有特性,这是外部对象无法访问,但通过访问器能够访问的特性
为了让方法或者特性变为私有,只要在它的名字前面加上双下划线即可:
1 class Secretive: 2 def __inaccessible(self): 3 print("Bet you can‘t see me..." 4 5 def accessible(self): 6 print("The secret message is:") 7 self.__inaccessible()
事实上,类的内部定义中,所有以双下划线开始的名字都被“翻译”成前面加上单下划线和类名的形式,因此实际上还能能在类外访问这些私有方法
3.类的命名空间
类的定义就是执行代码块
定义类时,所有位于class语句中的代码都在特殊的命名空间中执行——类命名空间。这个命名空间可由类内所有成员访问
4.指定超类
子类可以扩展超类的定义,将其他类名写在class语句后的圆括号内可以指定超类
1 class Filter: 2 def init(self): 3 self.blocked = [] 4 def filter(self, sequence): 5 return [x for x in sequence if x not in self.blocked] 6 7 class SPAMFilter(Filter): 8 def init(self): 9 self.blocked = [‘SPAM‘]
FIlter是一个用于过滤序列的通用类,事实上它不能过滤任何东西
Filter类的用处在于它可以用作其他类的基类(超类),比如SPAMFilter类,可以将序列中的“SPAM”过滤出去
SPAMFilter类中重写了基类Filter中的init()方法,继承了filter()方法
这里展现了继承的用处:可以写一大堆不同的过滤类,全部从Filter类继承,每一个都可以使用已经实现的filter()方法
5.调查继承
查看一个类是否是另一个的子类,可以用内建的issubclass()函数:
想知道已知类的基类,可以使用他的特殊特性__bases__
可以使用isinstance()方法检查一个对象是否为另一个类的实例
可以看出s是SPAMFilter类的成员,也是Filter类的成员,因为SPAMFilter类是Filter的子类
isinstance()对于类型也起作用,比如字符串类型(str)
如果只想知道一个对象属于哪个类,可以使用__class__特性
6.多重继承
1 class Calculator: 2 def calculate(self, expression): 3 self.value = eval(expression) 4 5 class Talker: 6 def talk(self): 7 print("Hello, my name is " + int(self.value)) 8 9 class TalkingCalculator(Calculator, Talker): 10 pass
子类(TalkingCalculator)自己不做任何事情,只是从自己的超类继承所有行为
这种行为称为多重继承
当使用多重继承的时候,应当注意:如果一个方法从多个超类继承,那么先继承的类(写在后面)中的方法会重写后继承的类(写在前面)中的方法
原文:https://www.cnblogs.com/albert0504/p/11675114.html