python-7面向对象高级编程
2024-10-19 13:37:15
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.类的方法集合。
最新文章
- sdk命令
- ArrayList
- 【leetcode❤python】 160. Intersection of Two Linked Lists
- Linux 下Git的安装和配置
- web前端开发(4)
- RHEL 6.4 安装svn和apache
- There is no result type defined for type &#39;json&#39; mapped with name &#39;success&#39;. Did you mean &#39;json&#39;?
- Sprite Kit编程指南中文版下载
- perl malformed JSON string, neither tag, array, object, number, string or atom, at character offset
- UIView 和 CALayer 的区别和联系
- Oracle与Mysql区别简述
- Python-函数小结
- 学习Spring
- git教程:撤销修改
- python 运行环境
- 【XMPP】Smack源码之初步认识
- winform嵌入word解决方案一
- 图片路径转base64字节码
- mvc4使用百度ueditor编辑器
- Xcode 5.0.1安装插件:规范注释生成器VVDocumenter + OSX 10.9.2
热门文章
- Eclipse plug-in startup
- Android - 通过真实案例学习解内存泄漏问题,最终发现Android原生Bug
- Struts2_动态结果集
- django定时任务小插件
- JavaScript基础:比较运算符——==与 ===;!=与!==
- (原创)北美信用卡(Credit Card)个人使用心得与总结(个人理财版) [精华]
- 显示C++数据的数据类型
- vs下如何调试Dll
- 12/13 exercise
- 命令行输入Jmeter提示不是内部或外部命令,处理方式:添加环境变量