1.构造函数

命名为_init_。构造函数的不同之处在于,在创建对象后会自动调用它们。

>>>f=FooBar()

在Python中,创建构造函数很容易,只需要将方法init的名称从普通的init改为魔法版的_init_就可以了。

class.FooBar:
	def _init_(self):
		self.somevar = 10
f=FooBar()
f.somevar
10

如果要给构造函数多添加几个参数呢?

class FooBar:
	def _init_(self,value=10):
		self.somevar=value

由于参数可选,所以像原来那样做没有问题。要指定参数的话,可以这么做:

>>>f=FooBar('参数')
>>>f.somevar
参数

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新增了鸣叫功能

虽然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)

只添加了一行代码,为何管用呢?
对实例调用方法时,方法的函数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)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐