python学习(八):面向对象(三)
来源:互联网 发布:水岛宏 知乎 编辑:程序博客网 时间:2024/06/06 00:04
class type
type()函数既可以返回一个对象的类型,又可以创建出新的类型,原型为:
type(object) -> the object's typetype(name, bases, dict) -> a new type
- 要创建一个class对象,type()函数依次传入3个参数:
class的名称;继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;class的方法名称与函数绑定。 - 通过type()函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。
- 正常情况下,我们都用class Xxx…来定义类,但是,type()函数也允许我们动态创建出类来,也就是说,动态语言本身支持运行期动态创建类,这和静态语言有非常大的不同,要在静态语言运行期创建类,必须构造源代码字符串再调用编译器,或者借助一些工具生成字节码实现,本质上都是动态编译,会非常复杂。
枚举类
- 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份;好处是简单,缺点是类型是int,并且仍然是变量。更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例,如下: *
from enum import EnumMonth = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))for name, member in Month.__members__.items(): print(name, '=>', member, ',', member.value)#value属性则是自动赋给成员的int常量,默认从1开始计数。
- 如果需要更精确地控制枚举类型,可以从Enum派生出自定义类:
from enum import Enum, unique@uniqueclass Weekday(Enum): Sun = 0 # Sun的value被设定为0 Mon = 1 Tue = 2 Wed = 3 Thu = 4 Fri = 5 Sat = 6#@unique装饰器可以帮助我们检查保证没有重复值#既可以用成员名称引用枚举常量,又可以直接根据value的值获得枚举常量;Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较
metaclass
除了使用type()动态创建类以外,要控制类的创建行为,还可以使用metaclass。
metaclass,直译为元类,简单的解释就是:
当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。连接起来就是:先定义metaclass,就可以创建类,最后创建实例。所以,metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。
# metaclass是类的模板,所以必须从`type`类型派生:class ListMetaclass(type): def __new__(cls, name, bases, attrs): attrs['add'] = lambda self, value: self.append(value) print(type(cls)) return type.__new__(cls, name, bases, attrs)class MyList(list, metaclass=ListMetaclass): passml=MyList()print(type(ml))print(dir(ml))ml.add(1)ml.add(2)print(ml)#__new__()方法接收到的参数依次是:# cls:当前准备创建的类的对象,即ListMetaclass;# name:类的名字,即MyList;# bases:类继承的父类集合;# attrs:类的方法集合。
metaclass是Python中非常具有魔术性的对象,它可以改变类创建时的行为。这种强大的功能使用起来务必小心。
0 0
- python学习(八):面向对象(三)
- python学习笔记(三)面向对象
- Python学习14:面向对象编程(三)
- python学习笔记(三)之面向对象编程
- Python学习笔记(三)——模块|面向对象
- python学习(三)面向对象
- Python学习笔记(八):面向对象编程、错误调试和测试(快速入门篇)
- python面向对象(三)之继承
- 学习PHP面向对象(三)封装
- JS面向对象学习笔记(三)
- java学习笔记-面向对象(三)
- java学习笔记-面向对象(三)
- java学习记录----面向对象(三)
- 学习PHP面向对象(八) 静态变量的问题
- PHP学习笔记之PHP面向对象(八)
- Golang 学习之路八:面向对象-方法(Method)
- python学习-面向对象进阶之闭包(八)
- Python学习笔记(2)--面向对象
- 第十一章 异常处理
- initializer_list形参总结
- java学习之实验二
- Boost库 对时间和日期的处理 date_timer库
- CSS之表格
- python学习(八):面向对象(三)
- 其他需要整理
- smarty模板引擎_9-Smarty模板的继承特性
- 水题 hdoj-2006奇数偶数判断小技巧 、 hdoj-2007
- Scalaz(36)- Free :实践-Free In Action - 实用体验
- 笔试题总结
- 1. Two Sum
- 剑指offer面试题之求两个链表的第一个公共点
- Android 工具类 Toast Log.d()