第九章 特殊方法、属性和迭代器

2017年12月6日17:31:41
  • A+
所属分类:Python基础

有的名称会在前面和后面都加上两个下划线,这种写法很特别

比如__future__

这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这种名字

Python中,由这些名字组成的集合所包含的方法称为特殊方法,如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下

(确切地说是根据名字)被Python调用。而几乎没有直接调用它们的必要。

 

9.1准备工作

是新版的Python,但一些特性(比如属性和super函数)不会在老式的类上起作用。为了确保类

是新型的,应该把赋值语句_metaclass-  type放在你的模块的最开始(第7章中提到过),或者

(直接或者间接)子类化内建类(实际上是类型)object(或其他一些新式类)。考虑下面的两个类。

class NewStyle(object):

more code here

class OldStyle:

more code here

在这两个类中,NewStyle是新式的类,OldStyle是旧式的类。如果文件以__metaclass__ = type开始,那么两个类都是新式类。

 

9.2构造方法

当一个对象被创建后,会立即调用构造方法,__init__()

class FooBar:
def __init__(self,value=42):
self.somevar=value
f=FooBar()
print f.somevar

42

f=FooBar('ssss')
print f.somevar

ssss

 

Python中有一个魔法方法叫做__del__(),也就是析构方法,.建议读者尽力避免使用__del__函数。

 

9.2.1,重写一般方法和特殊的构造方法

重写是继承机制中的一个重要内容,对于构造方法尤其重要。构造方法用来初始化新创建对

象的状态,大多数子类不仅要拥有自己的初始化代码,还要拥有超类的初始化代码。虽然重写的

机制对于所有方法来说都是一样的,但是当处理构造方法比重写普通方法时,更可能遇到特别的

问题:如果一个类的构造方法被重写,那么就需要调用超类(你所继承的类)的构造方法,否则

对象可能不会被正确地初始化。

 

class Bird:

def   init  (self)

self.hungry=True

def eat(self):

if self.hungry:

print 'Aaaah...'

self.hungry=False

else:

print 'No, thanks)'

 

9.2.2调用未绑定的超类构造方法

在目前的版本(2.6)以及3.0的版本中调用超类的构造方法可以使用super函数,对于更低的版本可以使用一下方法:

class SongBird(Bird):

def   init  (self):

    Bird.__init__(self)

self.sound='Squawk!'

def sing(self):

print self.sound

可以直接只用超类的类名加上父类的方法即可,SongBird类中只添加一行代码 Bird.__init__(self)

 

为什么会有这样的结果?在调用一个实例(即创建的对象)的方法时,该方法的self参数会被自动绑定到实例

上(这称为绑定方法)。前面已经给出了几个类似的例子了。但如果直接调用类的方法(比如

Bird._init_() 那么就没有实例会被绑定。这样就可以自由地提供需要的self参数。这样的方

法称为未绑定(unbound)方法,也就是这节标题中所提到的。(这个可以理解,就和java的静态方法调用一样)

 

9.2.3使用super函数

在新版的Python中都是用super函数来调用超类的方法,只能在新式类中使用

在Python 3.0中,super函数可以不用任何参数进行调用

 

下面的例子是对bird。例子的更新。

__metaclass__ = type  #super函数只在新式类中起作用

__metaclass__ = type

class Bird:
def __init__(self):
self.hungry = True

def eat(self):
if self.hungry:
print 'Aaaah...'
self.hungry = False
else:
print 'No, thanks!'

class SongBird(Bird):
def __init__(self):
# Bird.__init__(self)
super(SongBird, self).__init__() #在Python 3.0中,super函数可以不用任何参数进行调用
self.sound = 'Squawk!'

def sing(self):
print self.sound

bd  = Bird()
bd.eat()
bd.eat()
Sb = SongBird()
Sb.eat()
Sb.eat()
Sb.sing()

 

 

输出:

C:\Python27\python.exe C:/Users/hspcadmin/PycharmProjects/untitled/ClassTest.py

Aaaah...

No, thanks!

Aaaah...

No, thanks!

Squawk!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: