牛逼!Python的类和对象(长文系列第⑤篇)(上)

封装

封装这个概念应该并不陌生,比如我们把一些数据封装成一个列表,这就属于数据封装,我们也可以将一些代码语句封装成一个函数方便调用,这就是代码的封装,我们也可以将数据和代码封装在一起。用术语表示的话,就是可以将属性和方法进行封装,从而得到对象。

首先我们可以定义一个类,这个类中有属性和方法,但有的伙伴会比较好奇,属性和方法不是会封装成对象嘛,为什么又变成类了?举个例子,类就好比是一个毛坯房,而对象是在毛坯房的基础上改造成的精装房。

class XiaoMing:
    #属性
    height = 180
    weight = 65
    sex = '男'
    #方法
    def run(self):
        print('小明在跑步')
    def sleep(self):
        print('小明在睡觉')

在类定义完成时就创建了一个类对象,它是对类定义创建的命名空间进行了一个包装。类对象支持两种操作:属性引用和实例化。

属性引用的语法就是一般的标准语法:obj.name。比如XiaoMing.height和XiaoMing.run就是属性引用,前者会返回一条数据,而后者会返回一个方法对象。

In[1]:print(XiaoMing.height)
Out[1]:180

In[2]:print(XiaoMing.run)
Out[2]:<function XiaoMing.run at 0x0000021C6239D0D0>

这里也支持对类属性进行赋值操作,比如为类中的weight属性赋予一个新值。

In[3]:print(XiaoMing.weight)
Out[3]:65

In[4]:XiaoMing.weight = 100
In[5]:print(XiaoMing.weight)
Out[5]:100

而类的实例化可以将类对象看作成一个无参函数的赋值给一个局部变量,如下:

In[6]:ming = XiaoMing()

ming就是由类对象实例化后创建的一个实例对象,通过实例对象也可以调用类中的属性和方法。

In[7]:ming.run()
Out[7]:小明在跑步

In[8]:print(xiaoming.height)
Out[8]:180
#通过向类对象调用方法返回的方法对象中传入实例对象也可以达到同样效果
In[11]:XiaoMing.run(ming)
Out[11]:小明在跑步

魔法方法__init__

类在实例化过程中并不都是像上面例子一样简单的,一般类都会倾向将实例对象创建为有初始状态的,所以在类中可能会定义一个__init__的魔法方法,这个方法就可以帮助接收、传入参数。

而一个类如果定义了__init__方法,那么在类对象实例化的过程中就会自动为新创建的实例化对象调用__init__方法,请看下面这个例子。

class Coordinates:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def print_coor(self):
        print('当前坐标为(%s,%s)'%(self.x,self.y))

可以看到在__init__()中传入了参数x和y,然后在print_coor中需要接收参数x和y,接下来通过实例化这个类对象,验证一下参数是否能通过__init__()传递到类的实例化操作中。

In[9]:coor = Coordinates(5,3)
In[10]:coor.print_coor()

Out[10]:当前坐标为(5,3)
上一篇:牛逼!Python函数和文件操作(长文系列第3篇)(中)


下一篇:C++指针和引用的区别