关于对python中self的深入理解

假设有一个类nameMain(), 如最下面代码

  • 类 : 一个抽象的模板。可以理解为抽象设计图
  • 类名:类的名字。
    查看/实现方式 :print(nameMain)或者print(self.class)
  • 类的实例:即类创建的对象,类每创建一个实例就开辟新的内存地址指向这个创建的实例。抽象设计图具体实现的东西
    查看/实现方式 : a=nameMain(带参/无参)
  • self : 表示类创建的实例/对象本身,指向当前创建对象的内存地址。在__init__魔方方法中创建

类可以创建很多不同的实例,这些实例又有自己特定的特征,如何很好的调用和匹配好 所创建的实例对象 及其特征 就需要self。

理解:

例如 :类中创建了对象a和对象b, self对象就是a和b对象的抽象的统称,关于对象a和对象b的特征,可以用self来调用,当self指向a时就指向a的内存地址,可以调用a的特征;同理self指向对象b就指向b的内存地址,就可以调用b的特征。

比如 : 可以把 对象a 和 对象b 理解成 客户a 和 客户b, 类理解为某个房子。这时候客户a和客户b都买了同一个设计图出的房子,但是他们想要自己的装修风格,这些装修风格就是对象a、对象b的特征。当装修队开始装修房子时,先选择具体客户,然后根据客户要求装修;而先服务哪个客户呢?客户就选择self客户管理工具指向的现在的客户,同时self还可以调用对象的特征,这时候根据self指示的客户和self调用客户要求的装修风格来装修房子。

  • 客户a=类的对象a;
  • (客户要求的)装修风格=对象a/b的特征;
  • 房型=类 装修队=代码的执行

具体代码:

""" self的理解 :
    1, self表示类的实例 或 对象, 指向当前对象的内存地址 (self不指向类本身,而是类创建的实例/对象)
    2, 类中定义的函数的self 与 init中self的内存地址 + 创建实例的内存地址 保持一致(都指向同一个内存地址)
    3, self.__class__ 用来查看当前类名,相当于print(nameMain)
    """
class nameMain(object):
    def __init__(self, name, age):
        print("init中的self={}".format(self))
        print("self.__class__用于查看当前类名 : ", self.__class__)
        self.name = name
        self.age = age

    def printStu(self):
        print("def中的self={}".format(self))
        return "name={}, age={}".format(self.name, self.age)

if __name__ == "__main__":
    a = nameMain("immuable", 18)
    print("a = {}".format(a))  # self 打印地址=对象a的地址
    print(a.printStu())
    print()
    b=nameMain("muable", 100)  # self 打印地址=对象b的地址
    print("b = {}".format(b))
    print(b.printStu())

输出

# 对象a
init中的self=<__main__.nameMain object at 0x0000022E78A2F8D0>
self.__class__用于查看当前类名 :  <class '__main__.nameMain'>
a = <__main__.nameMain object at 0x0000022E78A2F8D0>
def中的self=<__main__.nameMain object at 0x0000022E78A2F8D0>
name=immuable, age=18

#对象b
init中的self=<__main__.nameMain object at 0x0000022E78A2F828>
self.__class__用于查看当前类名 :  <class '__main__.nameMain'>
b = <__main__.nameMain object at 0x0000022E78A2F828>
def中的self=<__main__.nameMain object at 0x0000022E78A2F828>
name=muable, age=100

self的值是什么?

self的值是Python会自动赋值的,而且值是对象本身。举例说明:类Dog,他的实例是d,那么,d调用类的方法jian(arge1,arge2)的时候,Python会自动转为Dog.jian(d,arge1,arge2)。self的值是Dog的实例d。

以下例子,打印self的值。(打印结果中的intance是实例的意思)

总结

到此这篇关于对python中self的深入理解的文章就介绍到这了,更多相关python中self理解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python类中的self和变量用法及说明

    目录 1.self是什么 以上述代码I为例 2.self的使用场景 在类中,self的使用有下面3个场景 3.python的几种变量——按作用域分 4.self和变量的关系 具体的使用场景 5.一点补充 为实例绑定属性有两种方式 在python的类中会使用到“self”,本文主要是谈谈类中的self和变量的关系. 先看示例代码I. class Test(object): def __init__ (self, val1): self.val0 = val1 def fun1(self): pri

  • Python中的self用法详解

    在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self.其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法. class是面向对象的设计思想,instance(也即是 object,对象)是根据 class 创建的. 一个类(class)应该包含数据和操作数据的方法,通俗来讲就是属性和函数(即调用方法). 类 class 中为啥用使用 self ? 在类的代码(函数)中,需要访问当前的实例中的变量和函数,即访问Instance中的

  • Python类中self参数用法详解

    Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的概念,似乎有点弄明白了. 首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的.self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数. self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以,但是约定成俗(为了和其他编程语言统一,减少理解难度),不要搞另类,

  • Python self 参数详解

    1.概述 1.1 场景 我们在使用 Python 中的 方法 method 时,经常会看到 参数中带有 self,但是我们也没对这个参数进行赋值,那么这个参数到底是啥意思呢? 2.知识点 2.1 成员函数(m) 和 普通方法(f) Python 中的 "类方法" 必须有一个额外的 第一个参数名称(名称任意,不过推荐 self),而 "普通方法"则不需要. m.f.c 都是代码自动提示时的 左边字母(method.function.class) # -*- codin

  • Python self参数详细介绍

    在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数.例如,定义一个 Person 类: class Person: def__init__(self): print("正在执行构造方法") # 定义一个study()实例方法 defstudy(self,name): print(name,"正在学Python") 那么,self 到底扮演着什么样的角色呢?本节就对 self 参数做详细的介绍. 事实上,

  • Python self用法详解

    在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数.例如,定义一个 Person 类: class Person: def __init__(self): print("正在执行构造方法") # 定义一个study()实例方法 def study(self): print(self,"正在学Python") zhangsan = Person() zhangsan.study() lisi = Pers

  • python定义类self用法实例解析

    这篇文章主要介绍了python定义类self用法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在定义类的过程中,无论是显式的创建类的构造方法,还是向类中添加实例方法,都要将self参数作为方法的第一个参数. class Person: def __init__(self): print("正在执行构造方法") def study(self, name): print(name, "正在学python")

  • Python中的全局变量如何理解

    Python是一种面向对象的开发语言,在函数中使用全局变量,一般应作全局变量说明,只有在函数内经过说明的全局变量才能使用. 首先应该说明的是需要尽量避免使用Python全局变量.不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性.对全局变量,如果程序员甲修改了_a的值,这时可能导致程序中的错误.这种错误是很难发现和更正的. 全局变量降低了函数或模块之间的通用性,不同的函数或模块都要依赖于全局变量.同样,全局变量降低了代码的可读性,阅读者可能并不知道调用的某个变量是全局变量. 但是

  • python中super()函数的理解与基本使用

    目录 前言 super的用法 super的原理 Python super()使用注意事项 混用super与显式类调用 不同种类的参数 总结 前言 Python是一门面向对象的语言,定义类时经常要用到继承,在类的继承中,子类继承父类中已经封装好的方法,不需要再次编写,如果子类如果重新定义了父类的某一方法,那么该方法就会覆盖父类的同名方法,但是有时我们希望子类保持父类方法的基础上进行扩展,而不是直接覆盖,就需要先调用父类的方法,然后再进行功能的扩展,这时就可以通过super来实现对父类方法的调用.

  • python中对_init_的理解及实例解析

    一.self的位置是出现在哪里? 首先,self是在类的方法中的,在调用此方法时,不用给self赋值,Python会自动给他赋值,而且这个值就是类的实例--对象本身.也可以将self换成别的叫法例如seef,但不建议,因为大家习惯也默认了写成self. 二.self的值是什么? self的值是Python会自动赋值的,而且值是对象本身.举例说明:类Dog,他的实例是d,那么,d调用类的方法jian(arge1,arge2)的时候,Python会自动转为Dog.jian(d,arge1,arge2

  • Python中生成器和yield语句的用法详解

    在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" 或者 "定义和使用函数")对于大多数学生是没有问题的.但是有一些话题,大多数学生只有很少,或者完全没有任何接触,尤其是"生成器和yield关键字".我猜这对大多数新手Python程序员也是如此. 有事实表明,在我花了大功夫后,有些人仍然不能理解生成器和yield关键字.我想让这个问题有所改善.在这篇文章中,我将解

  • python中copy()与deepcopy()的区别小结

    前言 copy()与deepcopy()之间的区分必须要涉及到python对于数据的存储方式. 深复制被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响. 浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变. import copy origin = [1, 2, [3, 4]] #origin 里边有三个元素:1, 2,[3, 4] cop

  • python中四舍五入的正确打开方式

    round()函数 (注意:下面的我也不清楚是否正确,我只是发表一下我的观点) 对于简单的舍入运算,使用内置的 round(value, ndigits) 函数即可 强烈建议不要去深究,就直接得结果就好 ndigiths可以为正数,也可以为负数,还可以为0,可以为空 n:就是精确到第n位小数,对整数没有影响,1为精确到十分位(注意:小数就是从十分位往后推的) -n:就是精确到整数位,-1为精确到十位,然后就是百位千位-有小数位就全舍掉,不管多大,但会保留一个为0的小数位 0:精确到个位,但会保留

  • 带你从内存的角度看Python中的变量

    目录 1.前言 2.引用式变量 3.赋值.浅拷贝与深拷贝 4.is的用法和id()函数 5.函数传参机制 6.扩展阅读 总结 1.前言 由于笔者并未系统地学习过Python,对Python某些底层的实现细节一概不清楚,以至于在实际使用的时候会写出一些奇奇怪怪的Bug(没错,别人写代码,我写Bug),比如对象的某些属性莫名奇妙地改变.究其原因,是对Python中的变量机制存在一些误解,毕竟以前一直是用C语言居多.无奈,只能深入学习这一部分的知识,并总结成此文. 阅读本文,你可以: 了解Python

  • 深入理解python中函数传递参数是值传递还是引用传递

    目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用"的方式.实际上,这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典 或者列表)的引用,就能修改对象的原始值--相当于通过"传引用"来传递对象.如果函数收到的是一个不可变对象(比如数字.字符或者元组)的引用,就不能 直接修改原始对象--相当于通过"传值"来传递对象. 你可以在很多讨论该问题

  • 理解Python中的With语句

    有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄. Without the with statement, one would write something along the lines of: 如果不用with语句,代码如下: file = open("/tmp/foo.txt") data = file.read() file.

  • 对于Python中RawString的理解介绍

    总结 1.'''作用: 可以表示 "多行注释" ."多行字符串" ."其内的单双引号不转义" 2.r 代表的意思是: raw 3.r 只对其内的反斜杠起作用(注意单个 \ 的问题) raw string 有什么用处呢? raw string 就是会自动将反斜杠转义. >>> print('\n') >>> print(r'\n') \n >>> (注:出现了两个空行是因为 print() 会自

随机推荐