1. 概述
2. Github原题
3. 类(Class)
3.1 什么是Class
3.2 如何创建Class
3.3 编写method函数
3.4 类实例化
4. __init__()和self
4.1 def__init__()
4.2 什么是self
4.3 self代表类的实例,而非类本身
5. 将函数填充进Class中
6. 总结
本文将根据Github中的一道Python练习题谈一谈Class中self用法的理解。
Question 5:
Define a class which has at least two methods:
getString: to get a string from console input
printString: to print the string in upper case.
Also please include simple test function to test the class methods.
中文翻译如下:
本小节内容将根据是什么(What)、怎么做(How)谈谈个人对Class的理解。
这里将用大白话进行阐述。Class就是一个大的集合,用官方用语来说,称之为模版。Class这个大的集合中,包含了一些小的集合,称之为方法(method)。
根据上述这道Github题,可知题目要求我们写一个Class,这里将这个Class命名为StringInOut。命名要求尽可能的简单,但是又要基本涵盖这个类的功能。命名规范请参考Python代码规范要求,这里不做赘述。
class StringInOut(object):
pass
上面2行代码即可完成创建一个class的工作。
没有实际方法(method)的class只是一个空壳子,不能真正起到Class的作用。给Class命名完成后,开始处理大集合中的小集合method了。method由函数构成。
在本题中,需要构建2个method,名字分别为getString和printString。getString函数是要实现通过键入的方式,获得一个字符串;printString函数是将键入的字符串以大写的形式打印出来。上述两个函数的代码如下:
def getString():
"""
Get a string object by input().
"""
stringIn = input()
return stringIn
def printString(stringIn):
"""
Print the input string in upper case.
"""
print(stringIn.upper())
if __name__ == '__main__':
# 1. Get a string.
print("1. Get a string.")
strIn = getString()
# 2. Print the input string.
print("2. Print the input string.")
printString(strIn)
代码运行结果如下:
1. Get a string.
hello world!
2. Print the input string.
HELLO WORLD!
输入“hello world!”,输出“HELLO WORLD!”。由结果可知函数编写功能是正确的。但是,只是编写完成method,未将其放入Class中。下一步工作,就是要将编写好的method填充进Class中,也是本文的重点。
在上文中,我们提到,类(Class)可以理解为一个大的集合,或者模版,即为抽象的东西。
当我们需要引用一个类,如本题中的StringInOut类,需要创建一个实例,代码如下:
# Create an instance.
str_obj = StringInOut()
所以,类实例化概念:通过建立一个类的实例,简单理解为建立引用该类的一个接口,才可以调用该类内的method方法。
在阅读Python官方文档,或者一些源码中,经常可以看到Class中会包含一个叫做self的参数,以及一个__init__()函数,它们对于类的构建,即将编写好的函数填充进类中,有什么帮助,将在这部分详细叙述。
init是英文initialize的缩写,中文即为初始化的意思。在类中包含一个init()函数,简单理解为初始化该类的意思。
当进行类实例化操作时,__init__()方法就会自动调用,进行类自动初始化操作,即一旦建立一个类的实例,它就会自动打开该接口,直接调用类内的方法,不需要做其他初始化工作。
method与普通的函数只有一个明显的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
因此,从语法上理解:只要创建一个类,且其包含一些method,该类的初始化方法必须包含self参数,即
def __init__(self):
pass
在本小节中,需要验证self在类中扮演的是什么角色。用一段测试代码进行验证:
class StringInOut:
def __init__(self):
print(self)
print(self.__class__)
# Create an instance
str_obj = StringInOut()
运行结果:
<__main__.StringInOut object at 0x103fcd390>
从结果可以看出,print(self)输出的是StringInOut实例的地址,print(self.__class__)则输出的是StringInOut这个类。
这一部分将根据题目要求,完成填充工作,完成Class的构建工作。
由上述编写的两个函数getString()和printString()可知,getString输出的值,为printString输入的值。在一个类内,要实现你的输出为我的输入,必须通过self进行实现。
在def __init__(self)中定义一个变量,初始值为空字符串,通过调用getString()方法,进行键入赋值,然后调用printString()方法将字符串转化为大写,并输出。完整代码如下:
class StringInOut:
def __init__(self):
# Define a variable stringIn.
self.stringIn = ""
def getString(self):
"""
Get a string object by input().
"""
self.stringIn = input()
def printString(self):
"""
Print the input string in upper case.
"""
print(self.stringIn.upper())
if __name__ == '__main__':
# 1. Create an instance
str_obj = StringInOut()
# 2. Get a string.
print("Get a string.")
strIn = str_obj.getString()
# 3. Print the input string.
print("Print the input string.")
str_obj.printString()
代码运行结果:
Get a string.
hello world
Print the input string.
HELLO WORLD
本文根据Github上的一道简单的Python练习题,对Class和self进行深入研究和理解,并用代码进行验证。在阅读官方文档,以及编程过程中,遇到一些晦涩难懂的概念时,必须动手编程,才能比较深刻的理解该定义。
总结:加油,学习编程就要动手干!