目录
-
-
- 1.构造函数
- 2.重写
- 3.调用未关联的超类构造函
- 4.调用函数super
-
1.构造函数
命名为_init_。构造函数的不同之处在于,在创建对象后会自动调用它们。
>>>f=FooBar()
- 1
在Python中,创建构造函数很容易,只需要将方法init的名称从普通的init改为魔法版的_init_就可以了。
class.FooBar:
def _init_(self):
self.somevar = 10
f=FooBar()
f.somevar
10
- 1
- 2
- 3
- 4
- 5
- 6
如果要给构造函数多添加几个参数呢?
class FooBar:
def _init_(self,value=10):
self.somevar=value
- 1
- 2
- 3
由于参数可选,所以像原来那样做没有问题。要指定参数的话,可以这么做:
>>>f=FooBar('参数')
>>>f.somevar
参数
- 1
- 2
- 3
Python提供了魔法方法_del_,也被叫做析构函数。这个方法在对象被销毁(作为垃圾被收集)前被调用。但是你不知道准确的调用时间,所以尽可能不使用它。
2.重写
要在子类中添加方法,一种基本方式是添加方法。
重写是继承机制的一个重要方面,对构造函数来说尤其重要。
构造函数用于初始化新建对象的状态,对大多数子类而言,除了超类的初始化代码,还要有自己的初始化代码。虽然所有方法的重写机制相同,但重写构造函数时必须调用超类的构造函数,否则可能无法正确地初始化对象。
解决这个问题有两种方法:1.调用未关联的超类构造函数2.使用函数super
class bird:
def _init_(self):
self.hungry = True
def eat(self):
if self.hungry:
print('A')
self.hungry =False
else:
print('不饿')
#上面这个类定义了鸟的基本能力——进食
>>>b=Bird()
>>>b.eat()
A
>>>b.eat()
不饿
class SongBird:
def _init_(self):
self.sound='嘎嘎'
def sing(self):
print(self.sound)
#使用方法和Bird类相同,子类SongBird新增了鸣叫功能
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
虽然SongBird类是Bird的子类,继承了方法eat,但当你调用它时,你就会发现一个问题。SongBird没有属性hungry。这是为什么呢?这是因为在SongBird中重写了构造函数,但新的构造函数没有包含初始化属性hungry的代码。下面介绍处理方法
3.调用未关联的超类构造函
class SongBird(Bird):
def _init_(self):
Bird._init_(self)
self.sound='嘎嘎'
def sing(self):
print(self.sound)
- 1
- 2
- 3
- 4
- 5
- 6
只添加了一行代码,为何管用呢?
对实例调用方法时,方法的函数self将自动关联到实例(称为关联的方法)。如果你通过类调用方法,就没有实例与其相关联。在这种情况下,你可以随便参数self。这样的方法称为未关联的。
4.调用函数super
调用这个函数时,将当前类和当前实例作为参数。对返回的对象调用方法时,调用的将是超类的方法而不是当前类的。
在Python3中调用函数super,可不提供任何参数。
#上述示例的修订版本
class Bird:
def _init_(self):
self.hungry=True
def eat(self):
if self.hungry:
print('A')
self.hungry = False
else:
print('不饿')
class SongBird:
def _init_(self):
super()._init_()
self.sound='嘎嘎'
def sing(self):
print(self.sound)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17