因为枚举成员不是有序的,所以它们只支持通过标识(identity) 和相等性 (equality) 进行比较。下面来看看 == 和 is 的使用:#!/usr/bin/env python3# -*- coding: UTF-8 -*-from enum import Enumclass User(Enum): Twowater = 98 Liangdianshui = 30 Tom = 12Twowater = User.TwowaterLiangdianshui = User.
但有些时候我们需要控制枚举的类型,那么我们可以 Enum 派生出自定义类来满足这种需要。通过修改上面的例子:#!
通过上面的实例可以知道通过 __members__ 可以遍历枚举类的所有成员。那为什么呢?我们可以先来大致看看 Enum 的源码是如何实现的;Enum 在模块 enum.py 中,先来看看 Enum 类的片段class Enum(metaclass=EnumMeta): """Generic enumeration. Derive from this class to define new enumerations. """可以看到,Enum 是继承元类 EnumMeta 的;
实际开发中,我们离不开定义常量,当我们需要定义常量时,其中一个办法是用大写变量通过整数来定义,例如月份:JAN = 1FEB = 2MAR = 3...NOV = 11DEC = 12当然这样做简单快捷,缺点是类型是 int ,并且仍然是变量。那有没有什么好的方法呢?这时候我们定义一个 class 类型,每个常量都是 class 里面唯一的实例。正好 Python 提供了 Enum 类来实现这个功能如下:#!
目录
运算符相关的魔术方法实在太多了,j就大概列举下面两类:1、比较运算符魔术方法说明__cmp__(self, other)如果该方法返回负数,说明 self < other; 返回正数,说明 self > other; 返回 0 说明 self == other。强烈不推荐来定义 __cmp__ , 取而代之, 最好分别定义 __lt__, __eq__ 等方法从而实现比较功能。 __cmp__ 在 Python3 中被废弃了。
经过之前编章的介绍,我们知道在 Python 中,常见的容器类型有: dict, tuple, list, string。其中也提到过可容器和不可变容器的概念。其中 tuple, string 是不可变容器,dict, list 是可变容器。 可变容器和不可变容器的区别在于,不可变容器一旦赋值后,不可对其中的某个元素进行修改。当然具体的介绍,可以看回之前的文章,有图文介绍。
一般来说,一个描述器是一个有“绑定行为”的对象属性 (object attribute),它的访问控制被描述器协议方法重写。这些方法是 __get__(), __set__() , 和 __delete__() 。有这些方法的对象叫做描述器。默认对属性的访问控制是从对象的字典里面 (__dict__) 中获取 (get) , 设置 (set) 和删除 (delete) 。举例来说, a.x 的查找顺序是, a.__dict__['x'] , 然后 type(a).
之前也有讲到过,Python 没有真正意义上的私有属性。然后这就导致了对 Python 类的封装性比较差。我们有时候会希望 Python 能够定义私有属性,然后提供公共可访问的 get 方法和 set 方法。Python 其实可以通过魔术方法来实现封装。方法说明__getattr__(self, name)该方法定义了你试图访问一个不存在的属性时的行为。
通过上一篇的内容,我们已经知道定义一个类时,我们经常会通过 __init__(self) 的方法在实例化对象的时候,对属性进行设置。比如下面的例子:#!/usr/bin/env python3# -*- coding: UTF-8 -*-class User(object): def __init__(self, name, age): self.name = name; self.age = age;
在 Python 中,所有以 "" 双下划线包起来的方法,都统称为"魔术方法"。比如我们接触最多的 `init__` 。魔术方法有什么作用呢?使用这些魔术方法,我们可以构造出优美的代码,将复杂的逻辑封装成简单的方法。那么一个类中有哪些魔术方法呢?我们可以使用 Python 内置的方法 dir() 来列出类中所有的魔术方法.示例如下:#!
距离上一篇已经三个多星期了,最近比较累,下班回到家,很早就休息了,所以更新的进度有点慢。目录
多态的概念其实不难理解,它是指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为。事实上,我们经常用到多态的性质,比如:>>> 1 + 23>>> 'a' + 'b''ab'可以看到,我们对两个整数进行 + 操作,会返回它们的和,对两个字符进行相同的 + 操作,会返回拼接后的字符串。
1、定义类的继承首先我们来看下类的继承的基本语法:class ClassName(BaseClassName): <statement-1> . . . <statement-N>在定义类的时候,可以在括号里写继承的类,一开始也提到过,如果不用继承类的时候,也要写继承 object 类,因为在 Python 中 object 类是一切类的父类。
1、类专有的方法一个类创建的时候,就会包含一些方法,主要有以下方法:类的专有方法:方法说明__init__构造函数,在生成对象时调用__del__析构函数,释放对象时使用__repr__打印,转换__setitem__按照索引赋值__getitem__按照索引获取值__len__获得长度__cmp__比较运算__call__函数调用__add__加运算__sub__减运算__mul…
1、直接在类中定义属性定义类的属性,当然最简单最直接的就是在类中定义,例如:class UserInfo(object): name='两点水'2、在构造函数中定义属性故名思议,就是在构造对象的时候,对属性进行定义。class UserInfo(object): def __init__(self,name): self.
1、定义类类定义语法格式如下:class ClassName: <statement-1> . . . <statement-N>一个类也是由属性和方法组成的,有些时候我们定义类的时候需要设置类的属性,因此这就需要构造函类的构造函数如下:def __init__(self,[...):类定义了 init() 方法的话,类的实例化操作会自动调用 init() 方法。
Python 是一门面向对象的语言, 面向对象是一种抽象,抽象是指用分类的眼光去看世界的一种方法。 用 JAVA 的编程思想来说就是:万事万物皆对象。也就是说在面向对象中,把构成问题事务分解成各个对象。面向对象有三大特性,封装、继承和多态。1、面向对象的两个基本概念类用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。
学习过 Java 的同学都知道,Java 的类里面可以给方法和属性定义公共的( public )或者是私有的 ( private ),这样做主要是为了我们希望有些函数和属性能给别人使用或者只能内部使用。 通过学习 Python 中的模块,其实和 Java 中的类相似,那么我们怎么实现在一个模块中,有的函数和变量给别人使用,有的函数和变量仅仅在模块内部使用呢?
关注时代Java