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.类的方法集合。

最新文章

  1. sdk命令
  2. ArrayList
  3. 【leetcode❤python】 160. Intersection of Two Linked Lists
  4. Linux 下Git的安装和配置
  5. web前端开发(4)
  6. RHEL 6.4 安装svn和apache
  7. There is no result type defined for type &#39;json&#39; mapped with name &#39;success&#39;. Did you mean &#39;json&#39;?
  8. Sprite Kit编程指南中文版下载
  9. perl malformed JSON string, neither tag, array, object, number, string or atom, at character offset
  10. UIView 和 CALayer 的区别和联系
  11. Oracle与Mysql区别简述
  12. Python-函数小结
  13. 学习Spring
  14. git教程:撤销修改
  15. python 运行环境
  16. 【XMPP】Smack源码之初步认识
  17. winform嵌入word解决方案一
  18. 图片路径转base64字节码
  19. mvc4使用百度ueditor编辑器
  20. Xcode 5.0.1安装插件:规范注释生成器VVDocumenter + OSX 10.9.2

热门文章

  1. Eclipse plug-in startup
  2. Android - 通过真实案例学习解内存泄漏问题,最终发现Android原生Bug
  3. Struts2_动态结果集
  4. django定时任务小插件
  5. JavaScript基础:比较运算符——==与 ===;!=与!==
  6. (原创)北美信用卡(Credit Card)个人使用心得与总结(个人理财版) [精华]
  7. 显示C++数据的数据类型
  8. vs下如何调试Dll
  9. 12/13 exercise
  10. 命令行输入Jmeter提示不是内部或外部命令,处理方式:添加环境变量