python中类的self到底是什么

Python编写类的时候,每个函数第一个参数都是self,查阅了资料,总结如下:

  • 首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
  • self指的是类实例对象本身(注意:不是类本身)。
  • self可以理解为一个字典变量,内部存的就是对象的数据属性。如:{‘name’:‘zhang’,‘age’:‘18’}就是这些。
class Box:
    def __init__(self, boxname, size, color):
        self.boxname = boxname #self指向类实例对象本身
        self.size = size
        self.color = color  # self就是用于存储对象属性的集合,就算没有属性self也是必备的

    def open(self, myself):
        print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
        print('-->用类自己的self,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))

    def close(self):
        print('-->关闭%s,谢谢' % self.boxname)


b = Box('魔盒', '14m', '红色')#self不用传值
b.close()
b.open(b)  # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。
print(b.__dict__)  # 这里返回的就是self本身,self存储属性,没有动作。

程序运行结果:

-->关闭魔盒,谢谢
-->用自己的myself,打开那个红色,14m的魔盒
-->用类自己的self,打开那个红色,14m的魔盒
{'boxname': '魔盒', 'size': '14m', 'color': '红色'}

Process finished with exit code 0

改造一下,打印出mySelf和self

class Box:
    # def myInit(mySelf, boxname, size, color):
    def __init__(mySelf, boxname, size, color):
        mySelf.boxname = boxname
        mySelf.size = size
        mySelf.color = color  # 自己写一个初始化函数,一样奏效,甚至不用self命名。其它函数当中用标准self
        print('mySelf: ', mySelf)
        # return mySelf  # 返回给实例化过程一个对象!神奇!并且含有对象属性/字典

    # def __init__(self, boxname, size, color):
    #     self.boxname = boxname
    #     self.size = size
    #     self.color = color  #注释掉原来标准的初始化

    def open(self, myself):
        print('self: ', self)
        print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
        print('-->用类自己的self,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))

    def close(self):
        print('-->关闭%s,谢谢' % self.boxname)


# 经过改造,运行结果和标准初始化没区别

# b = Box().myInit('魔盒', '14m', '红色')
b = Box('魔盒', '14m', '红色')
# b = Box('魔盒', '14m', '红色')#注释掉原来标准的初始化方法
b.close()
b.open(b)  # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。
print(b.__dict__)  # 这里返回的就是self本身,self存储属性,没有动作。

结果为:

mySelf:  <__main__.Box object at 0x000001B1C845C128>
-->关闭魔盒,谢谢
self:  <__main__.Box object at 0x000001B1C845C128>
-->用自己的myself,打开那个红色,14m的魔盒
-->用类自己的self,打开那个红色,14m的魔盒
{'boxname': '魔盒', 'size': '14m', 'color': '红色'}

Process finished with exit code 0

可以看到,mySelf 和self在一个类里指向的都是同一个类实例对象Box
原文中代码是这样的

class Box:
    def myInit(mySelf, boxname, size, color):
        mySelf.boxname = boxname
        mySelf.size = size
        mySelf.color = color  # 自己写一个初始化函数,一样奏效,甚至不用self命名。其它函数当中用标准self
        print('mySelf: ', mySelf)
        return mySelf  # 返回给实例化过程一个对象!神奇!并且含有对象属性/字典

    # def __init__(self, boxname, size, color):
    #     self.boxname = boxname
    #     self.size = size
    #     self.color = color  #注释掉原来标准的初始化

    def open(self, myself):
        print('self: ', self)
        print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
        print('-->用类自己的self,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))

    def close(self):
        print('-->关闭%s,谢谢' % self.boxname)


# 经过改造,运行结果和标准初始化没区别

b = Box().myInit('魔盒', '14m', '红色')
# b = Box('魔盒', '14m', '红色')#注释掉原来标准的初始化方法
b.close()
b.open(b)  # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。
print(b.__dict__)  # 这里返回的就是self本身,self存储属性,没有动作。

一样的结果:

mySelf:  <__main__.Box object at 0x0000021F34EFC1D0>
-->关闭魔盒,谢谢
self:  <__main__.Box object at 0x0000021F34EFC1D0>
-->用自己的myself,打开那个红色,14m的魔盒
-->用类自己的self,打开那个红色,14m的魔盒
{'boxname': '魔盒', 'size': '14m', 'color': '红色'}

Process finished with exit code 0

转载自:https://www.cnblogs.com/ekuj/p/8473594.html