1.__slots__

通过Types包中的MethodType将外部方法与类对象进行绑定(该方法只能对绑定的对象生效)

"""a test module"""
from types import MethodType__author__ = 'Jack Ma'class Student(object):"""a test class"""passdef set_name(self, name):self.name = name;a = Student()
a.set_name = MethodType(set_name, a, Student)
a.set_name("Jack")
print a.name

通过Types包中的MethodType将外部方法与类进行绑定(该方法能够被该类的所有对象使用)

"""a test module"""
from types import MethodType__author__ = 'Jack Ma'class Student(object):"""a test class"""passdef set_name(self, name):self.name = name;a = Student()
b = Student()
Student.set_name = MethodType(set_name, None, Student)
a.set_name("Jack")
b.set_name("Tom")
print a.name
print b.name

而当我们想对一个类可以赋予的属性进行限制,用到类的__slots__参数即可,__slots__赋值使用字符串为成员的元组进行赋值

class Student(object):"""a test class"""__slots__ = ('name', 'age')passdef set_name(self, name):self.name = name;a = Student()
Student.set_name = MethodType(set_name, None, Student)
a.set_name("Jack")
a.sex = "Male"
print a.name, a.sex

结果是sex属性插入不了,报错

Traceback (most recent call last):File "F:/PyProject/test2.py", line 23, in <module>a.sex = "Male"
AttributeError: 'Student' object has no attribute 'sex'

但是方法可以插入到类中

注意:使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的。除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__

from types import MethodType__author__ = 'Jack Ma'class Student(object):"""a test class"""__slots__ = ('name', 'age')passclass Class1(Student):"""a test son Class"""__slots__ = ()def set_name(self, name):self.name = name;a = Class1()
Class1.set_name = MethodType(set_name, None, Class1)
a.set_name("Jack")
a.sex = "Male"
print a.name, a.sex

此时,父类的__slots__限制才能生效

2.使用@property

class Student(object):"""a test class"""@propertydef score(self):return self._score@score.setterdef score(self, value):if not isinstance(value, int):raise ValueError('score must be an integer!')if value < 0 or value > 100:raise ValueError('score must between 0 ~ 100!')self._score = valuea = Student()
a.score = 11
print a.score

可以通过装饰器的setter属性 对score的设置属性进行限制

3.多继承

需要多继承时,在第二个类及之后的类后加上MiXin实现

class MyTCPServer(TCPServer, CoroutineMixin):pass

4.元类

用type()函数创建类

3个参数:

1.创建的类名 -- 字符串

2.父类 -- 元组

3.绑定的内容 -- 字典

def func(self, name):print "Hello %s !" % nameHello = type("Hello", (object,), {'hello': func})
a = Hello()
a.hello("World")

Hello World !

除了使用type()动态创建类以外,要控制类的创建行为,还可以使用metaclass。

metaclass,直译为元类,简单的解释就是:

当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。

但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。

连接起来就是:先定义metaclass,就可以创建类,最后创建实例。

所以,metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。

转载于:https://www.cnblogs.com/Msh0923/p/8087887.html

Python面向对象高级编程相关推荐

  1. Python 面向对象高级编程——定制类

    1.1   定制类 1.1.1   __str__ >>> class Student(object): ...    def __init__(self, name): ...   ...

  2. Python学习笔记:面向对象高级编程(完)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. Python学习笔记:面向对象高级编程(中下)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. Python学习笔记:面向对象高级编程(中上)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记:面向对象高级编程(上)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. python高级属性 用法 编程_python高级编程之面向对象高级编程

    1 面向对象编程 面向对象这节比较简单,就稍微总结几个特殊的点. 特殊方法__init__前后分别有两个下划线,__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init ...

  7. python笔记02_面向对象编程和面向对象高级编程

    面向对象编程 变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__.__score__这样 ...

  8. Python基础之六面向对象高级编程

    '''面向对象高级编程 ''' from enum import Enum'''__slots__限制实例属性定义的属性只对当前类实例起作用,对于继承的子类不起作用''' class Student( ...

  9. 【廖雪峰python总结】python高级特性,函数式编程,面向对象编程,面向对象高级编程

    文章目录 python复习总结 python高级特性 函数式编程 面向对象编程 面向对象高级编程 python复习总结 python高级特性 python高级特性 函数式编程 函数式编程 函数式编程的 ...

最新文章

  1. 新疆弃光量下降14% 弃光问题仍然难解
  2. 学会python编程容易吗-Python编程入门难不难
  3. 加工中心刻字宏程序_加工中心通用铣螺纹宏程序实例,千万别说你学不会!
  4. 【计算机网络】网络层 : 网络层简介 ( 功能 | 拥塞控制 )
  5. B/S和C/S的区别
  6. 技术面试问项目难题如何解决的_技术创新 | 降本增效,青海农信社项目小伙刻苦钻研解决联合支架设计难题!...
  7. 日历对象导哪个包_微信新表情瞬间炸裂,文物表情包永恒萌呆!
  8. 深入理解HTTP协议、HTTP协议原理分析【转】
  9. 多线程—— Lock(线程锁)
  10. 通用目标检测(集合)
  11. mysql如果空显示_mysql按照自己定义的值显示如果为空的就显示0
  12. css+html+对错号,错号怎么打 接着点击符号/其他符号;
  13. 软件定义和硬件重构知多少(三)
  14. python 内存不足_python内存不足
  15. HTML课题背景怎么写,课题研究的背景和意义怎么写
  16. 小白白之青龙面板搭建
  17. RT-thread内核之IO设备管理系统
  18. 语音识别ASR和NLP有什么区别?
  19. 黑苹果html5视频卡顿,W7系统如何设置开机自动连接宽带
  20. 修改Android手机内核,绕过反调试

热门文章

  1. 【转载】用java压缩文件夹/文件
  2. (软件工程)用例说明模板
  3. jQuery教程05-层级选择器
  4. 分享几个病毒分析检测网址
  5. 计算机辅助工程分析及应用论文,计算机辅助工程计量的论文
  6. redhat linux 9.0 拷贝u盘的文件,肿么用U盘安装Linux,安装的是red hat 9.0…用Ubuntu很方便,redhat可以吗?...
  7. 模型预测控制c语言程序_搭建第一个程序控制电路LED灯,体会C语言的魅力
  8. java 正则表达式 组合_java基础:5.1 面向对象、类的关联 聚合 组合、正则表达式...
  9. 用java自动化访问百度测试_java+eclipse+selenium+百度搜索设置自动化测试
  10. 辨析*P++,*(p++),*(++p),++(*p),*(P--),*(--P)