对象(object):基本上可以看做数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。使用对象替代全局变量和函数的原因有很多种,其中对象最重要的优点包括以下几点:
多态(Polymorphism):
意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而它也会根据对象(或类)类型的不同而表现出不同的行为。
封装(Encapsulation):
指向程序中的其他部分隐藏对象的具体实现细节的原则。
继承(Inheritance):
以通用的类为基础建立专门的类对象。
创建类:
_metaclass_=type #确定使用新式类
class Person:
def setName(self,name):
self.name=name
def getName(self):
return self.name
def greet(self):
print("Hello world! I'm %s"%self.name)
foo=Person()
bar=Person()
foo.setName('Luke Skywalker')
bar.setName('Anakin Skywalker')
foo.greet()
bar.greet()
输出:
Hello world! I'm Luke Skywalker
Hello world! I'm Anakin Skywalker
参数self:是对于对象自身的引用,在调用foo的setName和greet函数时,foo自动将自己作为第一个参数传入函数中-------因此形象的命名为self。
特性、函数和方法:
self参数事实上正式方法和函数的区别。方法:将它们的第一个参数绑定到所属的实例上,因此无需显示提供该参数。当然也可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数了:
class Class:
def method(self):
print('i have a self!')
def function():
print("i don't...")
instance=Class()
instance.method()
instance.method=function
instance.method()
输出:
i have a self!
i don't...
注意:self参数并不依赖于调用方法的方式,前面我们使用的是instance.method(实例.方法)的形式,可以随意使用其他变量引用同一个方法:
class Bird:
song='Squaawk!'
def sing(self):
print(self.song)
bird =Bird()
bird.sing()
birdsong=bird.sing
birdsong()
输出:
Squaawk!
Squaawk!
变量birdsong引用绑定方法bird.sing上,也就意味着这还是会对self参数进行访问(它仍旧绑定到类的相同实例上)。
指定超类:子类可以扩展超类的定义,将其他类名写在class语句后的圆括号内可以指定超类:
class Filter:#作为SPAMFilter的超类
def init(self):
self.blocked=[]
def filter(self,sequence):
return [x for x in sequence if x not in self.blocked]
class SPAMFilter(Filter):#SPAMFilter是Filter的子类,将“SPAM'从序列中过滤出去
def init(self):#重写Filter超类中的init方法
self.blocked=['SPAM']
f=Filter()
f.init()
print(f.filter([1,2,3,'SPAM']))
s=SPAMFilter()
s.init()
print(s.filter(['SPAM','SPAM','SPAM','EGGS','BACON','SPAM']))#继承了Filter方法中的filter方法
输出:
[1, 2, 3, 'SPAM']
['EGGS', 'BACON']
检查继承:要想查看一个类是否是另一个的子类,可以使用内建的issubclass函数:
print(issubclass(SPAMFilter,Filter))
print(issubclass(Filter,SPAMFilter))
输出:
True
False