小白在刚开始用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的一些学习,具体的理论解释还待补充,欢迎大家提出建议和指导~