Python3 结合一道Github上的练习题理解Class, __init__()和self

目录

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. 总结


1. 概述

本文将根据Github中的一道Python练习题谈一谈Class中self用法的理解。

 

2. Github原题

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.

中文翻译如下:

  1. 定义一个包含至少2个方法的类;
  2. 方法getString功能要求:自己键入一个字符串;
  3. 方法printString功能要求:以大写的方式,输出键入的字符串。
  4. 还要写出测试自己写的类和方法的代码。

 

3. 类(Class)

本小节内容将根据是什么(What)怎么做(How)谈谈个人对Class的理解。

3.1 什么是Class

这里将用大白话进行阐述。Class就是一个大的集合,用官方用语来说,称之为模版。Class这个大的集合中,包含了一些小的集合,称之为方法(method)。

3.2 如何创建Class

根据上述这道Github题,可知题目要求我们写一个Class,这里将这个Class命名为StringInOut。命名要求尽可能的简单,但是又要基本涵盖这个类的功能。命名规范请参考Python代码规范要求,这里不做赘述。

class StringInOut(object):
    pass

上面2行代码即可完成创建一个class的工作。

  • 类名为StringInOut。
  • (object)表示继承的对象,即该类是从哪个类继承下来的。如果没有特定对象,所有的类都继承自object类。
  • pass是Python中的一个写法,表示未完待续的意思,这样运行就不会报错。可以先建立,之后再填充功能。

3.3 编写method函数

没有实际方法(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中,也是本文的重点。

3.4 类实例化

在上文中,我们提到,类(Class)可以理解为一个大的集合,或者模版,即为抽象的东西。

当我们需要引用一个类,如本题中的StringInOut类,需要创建一个实例,代码如下:

# Create an instance.
str_obj = StringInOut()

所以,类实例化概念:通过建立一个类的实例,简单理解为建立引用该类的一个接口,才可以调用该类内的method方法。

 

4. __init__()和self

在阅读Python官方文档,或者一些源码中,经常可以看到Class中会包含一个叫做self的参数,以及一个__init__()函数,它们对于类的构建,即将编写好的函数填充进类中,有什么帮助,将在这部分详细叙述。

4.1 def__init__()

init是英文initialize的缩写,中文即为初始化的意思。在类中包含一个init()函数,简单理解为初始化该类的意思。

当进行类实例化操作时,__init__()方法就会自动调用,进行类自动初始化操作,即一旦建立一个类的实例,它就会自动打开该接口,直接调用类内的方法,不需要做其他初始化工作。

4.2 什么是self

 method与普通的函数只有一个明显的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self

因此,从语法上理解:只要创建一个类,且其包含一些method,该类的初始化方法必须包含self参数,即

def __init__(self):
    pass

4.3 self代表类的实例,而非类本身

在本小节中,需要验证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这个类。

 

5. 将函数填充进Class中

这一部分将根据题目要求,完成填充工作,完成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

 

6. 总结

本文根据Github上的一道简单的Python练习题,对Class和self进行深入研究和理解,并用代码进行验证。在阅读官方文档,以及编程过程中,遇到一些晦涩难懂的概念时,必须动手编程,才能比较深刻的理解该定义。

总结:加油,学习编程就要动手干!

你可能感兴趣的:(Python3)