python-7面向对象高级编程
1-给类动态增加方法
class Student(object):
pass def set_score(self, score):
self.score = score Student.set_score = set_score #动态给类增加方法
s = Student()
s.set_score('dasheng')
print(s.score) #dasheng
2-使用 __slots__ 限制实例属性
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 #使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
#除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。
3- @property使用 (方便使用,属于装饰器)
class Student(object): @property #可读
def birth(self):
return self._birth @birth.setter #可写
def birth(self, value):
self._birth = value @property
def age(self): #可读,由于没有age.setter方法,表示只读
return 2015 - self._birth s = Student()
s.birth = 2011 #设置值
print(s.birth) #获取值
4-多重继承, 由于Python允许使用多重继承,因此,MixIn就是一种常见的设计。
class MyTCPServer(TCPServer, ForkingMixIn):
pass
5-定制类
__str__(self) 或 __repr__() #让打印对象更好看 __iter__(self) #用于for ... in循环
def __iter__(self):
return self # 实例本身就是迭代对象,故返回自己 __getitem__ #取下标 Fib()[5]
def __getitem__(self, n):
a, b = 1, 1
for x in range(n):
a, b = b, a + b
return a __getattr__() #当调用不存在的属性时,会试图调用__getattr__(self, 'score')来尝试获得属性
def __getattr__(self, attr):
if attr=='age':
return lambda: 25 __call__ #直接对实例进行调用
#通过callable()函数,我们就可以判断一个对象是否是“可调用”对象
介绍的是最常用的几个定制方法,还有很多可定制的方法,请参考Python的官方文档。
6-使用枚举
from enum import Enum
Month = 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)
6.1使用类创建
from enum import Enum, unique
@unique
class Weekday(Enum):
Sun=0
Mon = 1,
Tue = 2 day1 = Weekday.Mon
print(day1 == Weekday.Tue)#False
print(day1)#print(day1)
print(day1.value) #print(day1)
7 使用元类创建
type()函数既可以返回一个对象的类型,又可以创建出新的类型
def fn(self, name='word'):
print('hello %s' % name)
Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
print(type(Hello)) #<class 'type'>
h = Hello()
print(type(h)) #<class '__main__.Hello'>
metaclass 魔术方法
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs) class MyList(list, metaclass=ListMetaclass):
pass __new__()方法接收到的参数依次是:
1.当前准备创建的类的对象;
2.类的名字;
3.类继承的父类集合;
4.类的方法集合。
python-7面向对象高级编程的更多相关文章
- python学习 面向对象高级编程
---恢复内容开始--- 面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数 ...
- 【Python】[面向对象高级编程] 多成继承,定制类,使用枚举
1.多成继承 class SmallDog(Animal,Dog) pass MixIn就是一种常见的设计. 2.定制类类似__slots__这种形如 __xxx__ 的变量或者函数名,在python ...
- 【Python】[面向对象高级编程] 使用__slots__,使用@property
1.使用 __slots__ 给实例绑定方法, >>> def set_age(self, age): # 定义一个函数作为实例方法 ... self.age = age .. ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...
- C++面向对象高级编程(七)point-like classes和function-like classes
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
- C++面向对象高级编程(四)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
随机推荐
- Linux vi 常用指令总结
本文根据笔者,日常常用的linux下的vi指令,进行说明 一.基本操作 1.vi 文件名 进入vi 的“命令行模式”,此模式无法编辑,只能查看 需要按下键盘的“i”键,进入“编辑模式”,才能进行文件的 ...
- Office加载项安装
出自我的个人主页 Alvin Blog 前言 Excel加载项离不开安装,Excel加载项本身安装及其简单,但这是在申请下来Office开发者账户之后,再次之前都得自行安装 线上安装 微软申请开发者账 ...
- ansible安装php
环境:Centos 7.x 独立php-fpm.conf配置文件 [root@master playbook]# tree php php ├── php-fpm.conf └── php.yml p ...
- CAD出现向程序发送命令时出现问题提示解决方法分享
大家有没有遇到在使用cad打开图纸的时候提示向程序发送命令时出现错误的情况呢,如果你在使用cad的时候出现了这个提示,是由于软件的兼容性出现了问题,那么该怎么办呢,下面小编就给大家带来cad打开图纸提 ...
- 笨办法学Python(十一)
习题 11: 提问 我已经出过很多打印相关的练习,让你习惯写简单的东西,但简单的东西都有点无聊,现在该跟上脚步了.我们现在要做的是把数据读到你的程序里边去.这可能对你有点难度,你可能一下子不明白,不过 ...
- Selenium入门系列1 打开浏览器访问网页,退出浏览器
对于功能自动化的理解就是用测试工具替代手工.手工怎么操作的,工具也如何操作. 手工测试:在前置条件下,执行一定的操作步骤>与预期结果对比 功能自动化:在前置条件下,识别对象 >操作对象&g ...
- 使用Axure管理团队项目图文教程 团队协作操作步骤
Axure RP团队版和企业版都支持团队协作,可以创建和管理团队项目,即多人共同创作一个原型.本文通过图文教程的形式,讲解了如何基于Axure Share服务创建和管理团队项目.因为Axure Sha ...
- rsync安装配置实时同步
一.简介 1.认识 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的“Rsync算法”来使本地和远 程两个主 ...
- 不使用data-ng-app指令的表达式
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)
转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc03-feign/ 本文出自方志朋的博客 最新Finchley版本请访问: ...