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