> 文档中心 > Python面向对象编程之self,类变量和实例变量、__init__一文详解+代码展示

Python面向对象编程之self,类变量和实例变量、__init__一文详解+代码展示

目录

前言

一、Self参数

二、类变量实例变量

1.类变量

1.1 类属性绑定

 2.实例变量

2.1实例属性绑定

 三、__init__方法



前言

面向对象化编程所有的实例对象和实例方法都必须以self作为第一个参数,文章内容接上一章:Python面向对象编程基础之面向对象思想和特点、类和对象。这个系列将会很详细的解释清楚Python面向对象编程这一编程思想是如何具体实现的。

很多学Python伙伴问题有没有体系的面试题?
今天为大家推荐一款刷题神奇哦 :刷题面试神器牛客
各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官


一、Self参数

1.在定义完实例变量之后,实例方法时的第一个参数必须是self。但是self本身这个参数在python中并不是关键字,换成其他单词都是可以的。但是用的人多了,也就变成了我们约定俗成大家都能看懂的self,特指本身方法。

2.self在定义时需要定义,但是在调用时会自动传入。这里我们可以做个实验:

class close_attack:    attack_power=100    def power(self): print("基础攻击力100")solder=close_attack()solder.power()

 out:

基础攻击力100

我们并没有传入参数,但是却可以执行,说明该参数会自动调用。相当于C++中的this指针。

文接上述的例子,我们把类比作一个游戏中所有近战类角色通用模型,由类实例化后的角色才可以使用该角色。我们可以通过这个方法生成许多不同近战类型的角色,如先锋、近卫、重装类型的角色。而每个角色都有都有自己的技能,这个self就相当于自己的技能索引,有了self就可以使用自己的技能了。简单的来说,self代表的当前的实例对象本身,这样在调用实例方法等Python就知道哪个实例对象了:

这里我们可以做个实验演示:

class close_attack:    attack_power=100    def power(self): print("%s基础攻击力100" % self)solder1=close_attack()solder1.power()
基础攻击力100
solder2=close_attack()solder2.power()
基础攻击力100

 可以很明显发现self参数不同的实例对象对应的self参数是不一样的,self代表的当前的实例对象本身。

这里我们了解到两点最重要的点:

  • 实例方法第一个参数必须是self,而且会自动传入该参数
  • self代表的就是当前实例对象的本身
class close_attack:    attack_power=100    def power(self): print("%s基础攻击力100" % self)    def name(self,name): print('my name is %s'%name)solder1=close_attack()solder1.name('scount')
my name is scount
solder2=close_attack()solder2.name('ace')
my name is ace

上述例子我们用close_attack类生成了三个实例对象scount和ace,这两个对象在调用name()方法时,是通过self参数去确定究竟当前是哪个对象在调用方法的。因此在写实例方法时一定要写self参数且其位置在第一个,在调用时就不需要传入self参数了。

二、类变量和实例变量

1.类变量

  • 类变量是该类所有实例对象共享的属性,是所有实例都共用的。
  • 类中任意地方(所有方法中)都可以使用"类名.类属性名"来调用类属性
  • 类外任意地方都可以使用"类名.类属性名"或"实例名.类属性名"来调用类属性

比如:

class close_attack:    attack_power=100    def power(self): print("%s基础攻击力100" % self)    def name(self,name): print('my name is %s'%name)

变量attack_power就是一个类属性 该变量是所有实例对象共有的。类中的所有方法、实例都可以使用它。

solder1=close_attack()solder1.attack_power#100

1.1 类属性绑定

Python作为动态语言,类对象和实例对象都可以在运行时绑定任意属性。因此,类属性的绑定发生在两个地方:

  • 类定义时
  • 运行时任意阶段

因为是动态语言,所以可以在运行时增加属性,删除属性。

class close_attack:    attack_power=100close_attack.defense=100 #新增一个defense属性print('attack_power',close_attack.attack_power, ' - ', 'defense',close_attack.defense)

attack_power 100  -  defense 100
del close_attack.defenseprint('attack_power',close_attack.attack_power, ' - ', 'defense',close_attack.defense)

 

可以发现defense已经删除。

 2.实例变量

与类变量不同的是,实例变量作用域只能在该实例中使用其他实例都是单独的个体。

实例变量:是每个实例都独有的数据(也可以叫"实例属性")

  • 若该实例自带属于该实例自有的属性,则该属性就为该实例变量。
  • 而每个实例共有的属性则为类属性
class close_attack:    attack_power=100    def __init__(self,name): self.name = name print('my name is %s'%name)    def power(self): print("%s基础攻击力100" % self)solder1=close_attack('scount')solder1.name
my name is scount

Out[18]:

'scount'

上面例子中定义了一个类属性"attack_power",是所有实例共有的;定义了一个实例属性"name",是每个实例独有的。一个类中存在实例变量(定义了init方法且init方法中存在形参)时,那么在实例化类时就需要传入对应的实参,否则会报错。

2.1实例属性绑定

与类属性绑定相同,实例属性绑定也发生在两个地方:类定义时、运行时任意阶段。

class close_attack:    attack_power=100    def __init__(self,name,position): self.name = name self.position = positionace=close_attack('ace','shield')ace.defense=100print('Attribute is introduced :name:%s ,position: % s,defense: %s'%(ace.name,ace.position,ace.defense))
Attribute is introduced :name:ace ,position: shield,defense: 100 

 三、__init__方法

类在实例化时,init()方法会自动执行类内部的代码,通常用于初始化对象的属性。

__init__方法的第一参数永远是self,表示创建的当前类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。

有了__init__方法,在创建实例的时候(类实例化),就不能传入空的参数了,必须传入与__init__方法匹配的参数。如:

class close_attack:    attack_power=100    def __init__(self,name,position): self.name = name self.position = positionace=close_attack()

 若是不传入name和position则会报错:


很多学Python伙伴问题有没有体系的面试题?
今天为大家推荐一款刷题神奇哦 :刷题面试神器牛客
各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见。

手机爆料