【Python】class中init函数、self参数详解

      小白在刚开始用class来创建对象的时候,不理解为啥class中的方法都要先声明一个__init__方法,而且方法里都有self这个参数,后来,小白做了一个试验,发现这两个小的知识点有大的用处。

     首先,init方法前面带有两个横杠,而不是一个,小白学习之初用一个横线遇到报错的情况。

在Python中,遇到此种形式开头的函数,就是私有方法,不可以被外面的类调用。这个方法可以带参数初始化,并且首个参数必须是“self”(不过这个名字可以任意取,比如this,但是大家一般都用self,约定俗成,我觉得可以直接用self,或者想用myself也可以哒)

     然后,self参数:在类的方法中,在访问自身方法以及变量时,需要用到self。通俗来说,self即为当前类的实例自身。

(1)首先用不带init函数声明的情况,来创建一个class,看下会出现什么情况

这里我们创建了Outputs类,里面定义了两个方法,一个是读字典中的key值,一个是读字典中的values值

class Outputs:        
    #定义读key值的函数
    def keys_function(dict):
        keys = []
        #读出key
        for k in dict.keys():
            keys.append(format(k))
        return keys
    #定义读出value
    def values_function(dict):
        values = []
        for v in dict.values():
            values.append(format(v))
        return values

dict1={"key":1,"values":2}

然后,我们来看下调用的情况:

可以看到下面的报错,这是为什么呢?因为我们里面没有设置init函数,所以不可以实例化result对象/实例,其实,print的操作是返回的self本身,self存储属性,没有动作,但是由于我们没有创建,这里也没有结果。

result = Outputs(dict1)
print(result.__dict__)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-45-e738d7308f60> in <module>
----> 1 result = Outputs(dict1)
      2 
      3 print(result.__dict__)

TypeError: object() takes no parameters

那么再调用类中的方法时,我们就不能用上面创建的result了,直接使用Outputs还是可以的:可以看到相应的结果

dict2={"key":123,"values":456}
print('-------------------dict2--------------------------')
print (dict2)
keys = Outputs.keys_function(dict2)#解析key
print('-------------------keys--------------------------')
print (keys)
values = Outputs.values_function(dict2)#解析value
print('-------------------values--------------------------')
print(values)


-------------------dict2--------------------------
{'key': 123, 'values': 456}
-------------------keys--------------------------
['key', 'values']
-------------------values--------------------------
['123', '456']

(2)接下来给类添加init函数:

注意:这里我只给init加了self参数,并没有给另外两个函数添加,那么会产生什么情况呢?

class Outputs:
    def __init__(self,dict):
        self.dict = dict
        
    #定义读key值的函数
    def keys_function(dict):
        keys = []
        #读出key
        for k in dict.keys():
            keys.append(format(k))
        return keys
    #定义读出value
    def values_function(dict):
        values = []
        for v in dict.values():
            values.append(format(v))
        return values

dict1={"key":1,"values":2}

拿出结果看一下:可以看到这种情况下,是可以声明对象的

result = Outputs(dict1)
print(result.__dict__)



{'dict': {'key': 1, 'values': 2}}

那么用这个声明的对象传入参数会怎么样呢?可以看到下面报错了,因为如果用声明的方法,那么class中的函数的第一个参数都要有self,否则就会产生这种问题,不过,当你直接用Outputs对象调用,还是不会有问题的

keys = result.keys_function(dict2)
print('-------------------keys--------------------------')
print (keys)
values = result.values_function(dict2)
print('-------------------values--------------------------')
print(values)


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-53-7b0b7d93b476> in <module>
----> 1 keys = result.keys_function(dict2)
      2 print('-------------------keys--------------------------')
      3 print (keys)
      4 values = result.values_function(dict2)
      5 print('-------------------values--------------------------')

TypeError: keys_function() takes 1 positional argument but 2 were given

看下用Output调用的结果:

keys1 = Outputs.keys_function(dict2)
print('-------------------keys--------------------------')
print (keys1)
values1 = Outputs.values_function(dict2)
print('-------------------values--------------------------')
print(values1)

-------------------keys--------------------------
['key', 'values']
-------------------values--------------------------
['123', '456']

(3)那么下面就是要完善代码啦,把self和init都按标准形式创建好

class Outputs:
    def __init__(self,dict):
        self.dict = dict
        
    #定义读key值的函数
    def keys_function(self,dict):
        keys = []
        #读出key
        for k in dict.keys():
            keys.append(format(k))
        return keys
    #定义读出value
    def values_function(self,dict):
        values = []
        for v in dict.values():
            values.append(format(v))
        return values

看下结果:可以看到这种情况下,若果声明了result函数,就不能用原class名来调用

#声明函数
result = Outputs(dict1)
print('-------------------dict--------------------------')
print(result.__dict__)


keys = result.keys_function(dict2)
print('-------------------keys--------------------------')
print (keys)
values = result.values_function(dict2)
print('-------------------values--------------------------')
print(values)

keys1 = Outputs.keys_function(dict2)
print('-------------------keys--------------------------')
print (keys1)
values1 = Outputs.values_function(dict2)
print('-------------------values--------------------------')
print(values1)


-------------------dict--------------------------
{'dict': {'key': 1, 'values': 2}}
-------------------keys--------------------------
['key', 'values']
-------------------values--------------------------
['123', '456']
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-61-19db9a73230c> in <module>
     10 print(values)
     11 
---> 12 keys1 = Outputs.keys_function(dict2)
     13 print('-------------------keys--------------------------')
     14 print (keys1)

TypeError: keys_function() missing 1 required positional argument: 'dict'

再来看一种情况:

class Outputs:
    def __init__(self,dict):
        self.dict = dict
        
    #定义读key值的函数
    def keys_function(self):
        keys = []
        #读出key
        for k in (self.dict).keys():
            keys.append(format(k))
        return keys
    #定义读出value
    def values_function(self):
        values = []
        for v in (self.dict).values():
            values.append(format(v))
        return values


这时,下面的两个方法,用init函数的结果:可以看出这种情况下,就只能先声明函数,再调用里面的方法出结果,不可以直接像之前的形式调用方法。

keys = result.keys_function()
print('-------------------keys--------------------------')
print (keys)
values = result.values_function()
print('-------------------values--------------------------')
print(values)
print('---------------------------------------------------')
keys = result.keys_function(dict2)
print('-------------------keys--------------------------')
print (keys)
values = result.values_function(dict2)
print('-------------------values--------------------------')
print(values)



-------------------keys--------------------------
['key', 'values']
-------------------values--------------------------
['1', '2']
---------------------------------------------------
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-108-5ebe424cba61> in <module>
      6 print(values)
      7 print('---------------------------------------------------')
----> 8 keys = result.keys_function(dict2)
      9 print('-------------------keys--------------------------')
     10 print (keys)

TypeError: keys_function() takes 1 positional argument but 2 were given

      以上,是我对class的一些学习,具体的理论解释还待补充,欢迎大家提出建议和指导~

发布了92 篇原创文章 · 获赞 125 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Jarry_cm/article/details/98657701
今日推荐