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

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

前言


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


一、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()

<__main__.close_attack object at 0x0000018901557C08>基础攻击力100


1. solder2=close_attack()
2. solder2.power()


<__main__.close_attack object at 0x000001890154B8C8>基础攻击力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


1. solder2=close_attack()
2. 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=100
close_attack.defense=100 #新增一个defense属性
print('attack_power',close_attack.attack_power, ' - ', 'defense',close_attack.defense)

attack_power 100  -  defense 100

del close_attack.defense
print('attack_power',close_attack.attack_power, ' - ', 'defense',close_attack.defense)


9fa77371198f4c84900f294162a50862.png

可以发现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 = position
ace=close_attack('ace','shield')
ace.defense=100
print('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 = position
ace=close_attack()

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


3e8ade413b4b4539bbda4cc1f9fa74a1.png


目录
相关文章
|
14天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
25 6
|
9天前
|
Python
[oeasy]python050_如何删除变量_del_delete_variable
本文介绍了Python中如何删除变量,通过`del`关键字实现。首先回顾了变量的声明与赋值,说明变量在声明前是不存在的,通过声明赋予其生命和初始值。使用`locals()`函数可查看当前作用域内的所有本地变量。进一步探讨了变量的生命周期,包括自然死亡(程序结束时自动释放)和手动删除(使用`del`关键字)。最后指出,删除后的变量将无法在当前作用域中被访问,并提供了相关示例代码及图像辅助理解。
102 68
|
7天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
45 8
|
10天前
|
Shell Python
[oeasy]python049_[词根溯源]locals_现在都定义了哪些变量
本文介绍了Python中`locals()`函数的使用方法及其在调试中的作用。通过回顾变量赋值、连等赋值、解包赋值等内容,文章详细解释了如何利用`locals()`函数查看当前作用域内的本地变量,并探讨了变量声明前后以及导入模块对本地变量的影响。最后,文章还涉及了一些与“local”相关的英语词汇,如`locate`、`allocate`等,帮助读者更好地理解“本地”概念在编程及日常生活中的应用。
26 9
|
14天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
38 11
|
16天前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
31 11
|
11天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
12天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
38 6
|
16天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。
|
13天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!