Python 培训(三)—— 面向对象

关于面向对象

  • 面向对象是编程者必须熟练掌握的,面向对象技术其实给我们提供了巨大的方便,请各位萌新放下C++课程里的固有偏见,重新了解面向对象编程。

创建类

class Circle:
    def __init__(self, r=10):
        # 构造函数
        self.r = r
    
    def getS(self):
        return 3.14 * self.r * self.r
  • 如上所示,就是定义一个类的基本格式
  • Python 的函数都需要带一个参数 self,而且是第一个参数,这个参数就是指向这个类,相当于C++的 this 指针,但是记住每个函数参数中都要带上 self,Pycharm会自动补全 self 的。
  • Python 的类属性,不是像 C++ 一样单独写出来,如上所示,需要设置的类变量直接在构造函数里面赋值就可以了。

构造函数

  • Python 的构造函数如上所示,就是前后加两个下划线的 init 函数,上面的构造函数可以输入一个半径为参数,所以我们可以用下面两种方法创建对象:
circleOne = Circle(20)	# r = 20
circleTwo = Circle()	# r = 10

访问权限

  • Python 里面没有 private 这样的关键字,我也没有用过访问权限,但是有一种方法可以设置对外隐藏属性。
  • 在属性名称或者方法名前面加两个下划线就不能从外访问了,如下:
Class Circle:
    def __init__(self):
        self.__pi = 3.14
        # 无法从外部访问 __pi,可以从类内部访问
  • 上面这种严格的访问权限个人感觉我们用不上,下面介绍的特性就很方便。

特性与 property 函数

  • 通过存取方法定义的属性通常称为特性。可以用 property 函数将其写成变量的形式,现在你可能看不懂这句话,我们先看一段代码:
class Rectangle:
    def __init__(self):
        self.width = 0
        self.height = 0
    
    def set_size(self, size):
        self.width, self.height = size
        
    def get_size(self):
        return self.width, self.height
    
    size = property(get_size, set_size)
  • 仔细品一下,当你设置或者读取 size 属性的时候,就会自动调用那两个函数了。
  • property函数可以输入0-4个参数,一般输入1-2个参数,如果输入一个参数,创建的特性就是只读的
class Circle:
    def __init__(self):
        self.r = 10

    def get_s(self):
        return self.r * self.r * 3.14

    s = property(get_s)
  • 这样写的好处就是,不需要调用函数 get_s,只用和普通属性一样对待 s 即可,这样定义非独立属性,编程会更加舒服。

类的包含

  • 一个类里面可以包含另外一个类,举个简单的例子:
class Circle:
    def __init__(self, r):
        self.r = r

    def get_s(self):
        return self.r * self.r * 3.14

    s = property(get_s)


class Ring:
    def __init__(self, r1, r2):
        self.circleOne = Circle(r1)
        self.circleTwo = Circle(r2)

    def get_s(self):
        return abs(self.circleOne.s - self.circleTwo.s)

    s = property(get_s)
  • 一个圆环由两个圆构成,所以里面包含了两个圆的类。包含非常简单,就当普通变量处理就好了。

作业

  • 创建一个二维的点类 Point,可以在构造函数中指定 x、y 坐标,默认的坐标为(0,0)
  • 创建一个二维的线段类 Line,包含两个 Point,构造函数可以指定两个点的坐标。
  • Line 设置一个用 property 关联的特性变量 distance,distance为两点之间的距离。

本文章使用limfx的vsocde插件快速发布