Lesson 10

  • Python Senior, Lesson 10, v1.0.0, 2016.11 by David.Yi
  • v1.1, 2020.5.4 edit by David Yi

本次内容要点

  • 面向对象的编程之一
    • 类与实例
    • 类的属性
    • 类的方法
  • 思考一下

面向对象编程

类与实例

类,是一个定义;实例是真正的对象的实现,创建一个实例的过程称作实例化。

所有的类都继承自一个叫做 object 的类。继承的定义之后再说。

类的一些操作方式和函数很像,在没有面向对象编程方式的时候,就是面向过程(函数)的开发方式。

类可以很复杂,也可以很简单,取决于应用的需要。面向对象的编程方式,是现代流行的开发方式,博大精深,需要慢慢理解体会。一开始有些不太清楚,也没有关系。

类的属性

类可以理解为一种称之为命名空间( namespace),在这个类之下,数据都是属于这个类的实例的,我们称为属性,用实例名字+点+属性名字。这样的类比较简单,在 c 语言中称为结构体,在 pascal 中为记录类型,python 的数据结构比较简单。


In [3]:
# 申明一个 class MyData
class MyData(object):
    pass

# 实例化  MyData, 实例的名字叫做 obj_math
obj_math = MyData()
obj_math.x = 4
print(obj_math.x)


4
5

类的方法

光是把类作为命名空间太简单了,可以给类添加功能,称为方法。

方法定义在类中,使用在实例中。可以理解为实例是真正做事情的代码,所以在实例中调用方法完成某个功能是合理的。


In [6]:
class MyData(object):
    
    # 定义一个 SayHello 的方法,self 可以理解为必须传递的参数
    def SayHello(self):
        print('Hello!')
        
# 实例化
obj_math = MyData()

# 调用方法
obj_math.SayHello()


Hello!

In [9]:
# 类直接调用没有意义,报错
MyData.SayHello()


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-9-c6a1e4d0136a> in <module>()
----> 1 MyData.SayHello(self)

NameError: name 'self' is not defined

In [5]:
# 在上面基础上,复杂一点的例子

class MyData(object):
    
    # 初始化方法,双下划线前后
    # 实例化的时候,需要传递 self 之后的参数
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    # 定义一个 SayHello 的方法,self 可以理解为必须传递的参数
    def SayHello(self):
        print('Hello!')
        
    def Add(self):
        print(self.x + self.y)
        
# 实例化
obj_math = MyData(3,4)

# 调用方法
obj_math.SayHello()

obj_math.x = 5

obj_math.Add()

o1 = MyData(1,3)
o1.Add()


Hello!
9
4

In [15]:
# 再复杂一点,创建多个实例

class MyData(object):
    
    # 初始化方法,双下划线前后
    # 实例化的时候,需要传递 self 之后的参数
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    # 定义一个 SayHello 的方法,self 可以理解为必须传递的参数
    def SayHello(self):
        print('Hello!')
        
    def Add(self):
        print(self.x + self.y)
        
# 实例化
obj_math = MyData(3,4)

# 调用方法
obj_math.SayHello()
obj_math.Add()

# 再创建一个实例
obj_math2 = MyData(5,6)
obj_math2.Add()


Hello!
7
11

思考一下

启动一个最简单的服务器 python3 -m http.server

然后在浏览器中 127.0.0.1:8000 来进行访问这个服务器了


In [17]:
# 输入 n, 如果 n 等于 1 或者 等于 2 或者 等于 3, 显示 small,其他显示 big

n = int(input('Please input:'))

if n in [1,2,3]:
    print('small')
else:
    print('big')


Please input:3
small

In [18]:
def multiply(x):
    return (x*x)

def add(x):
    return (x+x)

funcs = [multiply, add]

for i in range(5):
    value = list(map(lambda x: x(i), funcs))
    print(value)


[0, 0]
[1, 2]
[4, 4]
[9, 6]
[16, 8]

In [ ]: