联博统计:Python 简明教程 --- 19,Python 类与工具

admin 4个月前 (06-27) 科技 39 0

微信民众号:码农充电站pro
个人主页:https://codeshellme.github.io

那些能用计算机迅速解决的问题,就别用手做了。
—— Tom Duff

目录

上一节 我们先容了Python 面向工具的相关观点,我们已经知道类与工具面向工具编程中非常重要的观点。

类就是一个模板,是抽象的。工具是由类建立出来的实例,是详细的。由同一个类建立出来的工具拥有相同的方式属性,但属性的值可以是差别的。差别的工具是差别的实例,互不滋扰。

1,类的界说

如下,是一个最简朴的类,实际上是一个空类,不能做任何事情:

class People:
    pass

在Python 中界说一个类,需要用到class 关键字,后边是类名,然后是一个冒号:,然后下一行是类中的代码,注重要有缩进

2,建立工具

People 虽然是一个空类,但依然可以建立工具,建立一个工具的语法为:

工具名 = 类名(参数列表)

参数列表是跟__init__ 组织方式相匹配的,若是没有编写__init__ 方式,建立工具,就不需要写参数,如下:

>>> p = People()
>>> p
<__main__.People object at 0x7fd30e60be80>
>>> 
>>> p1 = People()
>>> p1
<__main__.People object at 0x7fd30e60be48>

pp1 都是People类的工具。0x7fd30e60be80p 的地址,0x7fd30e60be48p1 的地址。可以看到差别的工具的地址是差别的,它们是两差别的实例,互不滋扰。

3,属性

类中可以包罗属性类中的变量),建立出来的工具就会拥有响应的属性,每个工具的属性的值可以差别。

建立好工具后,可以用如下方式给工具添加属性:

>>> p = People()
>>> p.name = '小明' # 添加 name 属性
>>> p.sex = '男'    # 添加 sex 属性
>>> p.name         # 接见工具的属性
'小明'
>>> p.sex          # 接见工具的属性
'男'

虽然在手艺上可以这样做,然则一样平常情况下,我们并不这样为工具添加属性,这样会损坏类的封装性,使得代码杂乱,不利于维护。

当接见一个不存在的属性时,会出现异常:

>>> p.job         # 一个不存在的属性
Traceback (most recent call last):
  File "<stdin>", LINE 1, in <module>
AttributeError: 'People' object has no attribute 'job'

我们一样平常会在__init__ 方式中为类添加属性并赋值。

4,__init__ 方式

在Python 的类中,以双下划线__头和末端的方式,被称为邪术方式,每个邪术方式都有特定的寄义。Python 为我们划定了一些邪术方式,让我们自己实现这些方式。

__init__ 方式叫做组织方式,用来初始化工具。Python 注释器会在天生工具时,自动执行组织方式,而无需用户显示挪用。

__init__ 方式不需要有返回值。

类中的所有实例方式 方式,都至少有一个参数,就是self。Python 中的self 相当于C++ 和Java 中的this 指针,都是代表当前工具。只是Python 中的self 需要显示写在方式的第一个参数,而this 指针则不需要写在方式参数中。

组织方式一样平常用于初始化工具的一些属性,组织函数可以不写,也可以只有一个self 参数。

当组织函数只有一个self 参数时,建立该类的工具时,不需要添加参数。当组织函数除了self 参数另有其它参数时,建立该类的工具时,则需要添加相匹配的参数。

好比,我们界说一个People 类,它有三个属性,分别是namesexage

class People:

    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
        print('执行了 __init__ 方式')

    def print_info(self):
        print('people:%s sex:%s age:%s' % (
            self.name, self.sex, self.age))

在这个People 类中除了有一个__init__ 方式外,另有一个print_info 方式,每个方式中的都有self 参数,并且是第一个参数,self 代表当前工具。

在建立该类的工具时,需要通报匹配的参数(self 参数不用通报):

>>> p = People('小明', '男', 18)
执行了 __init__ 方式
>>> p 
<People.People object at 0x7feb6276bda0>
>>> p.print_info()
people:小明 sex:男 age:18
>>>
>>> p1 = People('小美', '女', 18)
执行了 __init__ 方式
>>> p1
<People.People object at 0x7fd54352be48>
>>> p1.print_info()
people:小美 sex:女 age:18

可以看到,在建立pp1 工具时,字符串执行了 __init__ 方式 被打印了出来,而我们并没有显示挪用该方式,说明__init__ 方式被默认执行了。

工具pp1 是两个差别的工具,拥有相同的属性和方式,然则属性值是不一样的。两个工具互不滋扰,工具p 的地址为0x7feb6276bda0p1 的地址是0x7fd54352be48

执行代码p.print_info(),是挪用p 工具的print_info() 方式,由于,在界说该方式的时刻,只有一个self 参数,以是在挪用该方式的时刻,不需要有参数。

5,私有属性和方式

私有属性

通俗的属性,就像上面的namesexage 属性,都是公有属性,在类的外部都可以被随便的接见,就是可以用工具.属性名的方式来接见属性,如下:

>>> p = People('小明', '男', 18)
执行了 __init__ 方式
>>> p.name  # 接见属性
'小明'
>>> p.name = '小丽'  # 修改属性
>>> p.name  # 接见属性
'小丽'

这样就损坏了数据的封装性,这种接见方式是不可控(会不受限制的被随便接见)的,不利于代码的维护,不符合面向工具的编程规范。

以是,通常我们会将类中的属性,改为私有属性,就是不能以工具.属性名 这样的方式接见类属性。

在Python 中,通过在属性名的前边添加双下划线__,来将公有属性变为私有属性,如下:

#! /usr/bin/env python3

class People:

    def __init__(self, name, sex, age):
        self.__name = name   # 两个下划线
        self.__sex = sex     # 两个下划线
        self._age = age      # 一个下划线
        print('执行了 __init__ 方式')

    def print_info(self):
        print('people:%s sex:%s age:%s' % (
            self.__name, self.__sex, self._age))

这样就无法通过工具.属性名的方式来接见属性了,如下:

>>> p = People('小美', '女', 18)
执行了 __init__ 方式
>>> p.__name        # 出现异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'People' object has no attribute '__name'

然则,Python 中这种私有属性的方式,并不是真正的私有属性,Python 只是将__name 转换为了_People__name,即是在__name 的前边加上了_类名(_People),我们依然可以这样接见__name 属性:

>>> p._People__name
'小美'

但我们并不提倡这种方式,这会让代码变得杂乱难明。

可以注重到,People 类中的_age 属性是以单下划线开头的,这种以单下划线开头的属性是可以在类的外部被接见的:

>>> p._age
18

然则凭据Python 规范,以单下划线开头的属性,也被认为是私有属性,也不应该在类的外部接见(虽然在手艺上是可以接见的)。

注重:以双下划线__ 开头且末端的属性__xxx__,是特殊属性,是公有的,可在类的外部接见

私有方式

私有方式与私有属性类似,也可以在方式名的前边加上双下划线__,来将某个方式酿成私有的,一样平常不需要被外部接见的方式,应该将其设置为私有方式

6,setget 方式

为了数据的封装性,我们不应该直接在类的外部以工具.属性名的方式接见属性,那么若是我们需要接见类的属性该怎么办呢?

这时我们需要为每个私有属性都提供两个方式:

  • set 方式:用于设置属性的值
  • get 方式:用于接见属性的值

为了削减代码量,这里只为__name 属性设置了这两个方式,代码如下:

#! /usr/bin/env python3

class People:

    def __init__(self, name, sex, age):
        self.__name = name
        self.__sex = sex
        self._age = age
        print('执行了 __init__ 方式')

    def print_info(self):
        print('people:%s sex:%s age:%s' % (
            self.__name, self.__sex, self._age))

    # set 和 get 方式
    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

用户可以这样设置和接见类的属性:

>>> from People import People
>>> p = People('小美', '女', 18)
执行了 __init__ 方式
>>> p.get_name()         # 获取 name 值
'小美'
>>> p.set_name('小丽')   # 设置新的值
>>> p.get_name()        # 再次获取name 值
'小丽'

由于这种setget 方式,是由类的开发者提供的,是被开发者控制的。

类的开发者会凭据需要,来控制类的使用者若何使用该类,即哪些类的属性和方式应该被使用者接见,以及若何被使用者接见。

云云,类的使用者就不能随便的接见类中的属性,这就达到了封装的目的。

(完。)

推荐阅读:

Python 简明教程 --- 14,Python 数据结构进阶

Python 简明教程 --- 15,Python 函数

Python 简明教程 --- 16,Python 高阶函数

Python 简明教程 --- 17,Python 模块与包

Python 简明教程 --- 18,Python 面向工具

迎接关注作者民众号,获取更多手艺干货。

,

欧博电脑版

欢迎进入欧博电脑版(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

AllBetGaming声明:该文看法仅代表作者自己,与本平台无关。转载请注明:联博统计:Python 简明教程 --- 19,Python 类与工具

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:809
  • 页面总数:0
  • 分类总数:8
  • 标签总数:1375
  • 评论总数:346
  • 浏览总数:28448