一、使用__slots__限制属性绑定

  动态绑定实例的方法:

class Person(object):

    def run(self):
print("奔跑吧!") p1 = Person()
p1.name = "江北"

  但是这样,"new出来"的实例就可以为所欲为的绑定任意属性了。

  Python中提供了__solts__来限制属性绑定,这样就只能动态绑定指定的属性了!

class Person(object):
__slots__ = ("name", "age") def run(self):
print("奔跑吧!") p1 = Person()
p1.name = "江北"

  // 更多详细限制,不在此处赘述

二、使用@property

  上一章已经讲到,定义的属性可以通过get set来限制,但是似乎不像Java的IDEA一样,可以直接快捷生成对应get set,Python的手写set get显然不符合Python简洁的特性,为此,Python引入了@property(通过前面知道是一个装饰器)来完成这个功能。

  不使用装饰器之前:

class Person(object):

    def get_age(self):
return self._age def set_age(self, age):
if age > 0:
self._age = age p1 = Person()
p1.set_age(18)
print(p1.get_age())

  使用之后:

class Person(object):
@property
def age(self):
return self._age @age.setter
def age(self, value):
if age > 0:
self._age = value # 实际使用p1.age = xx时转为使用set,实际使用p1.age时转为get
p1 = Person()
p1.age = 19
print(p1.age)

  完整示例,参考:https://blog.csdn.net/u013205877/article/details/77804137

三、多重继承

    直接看写法:

class Dog(Mammal, Runnable):
pass

    通常,这种多重继承我们称之为 MixIn(mixin)

四、定制类

  形如之前限制绑定的__slots__就是存在特殊用途的,也就是之前介绍的__xx__形式的在Python中是特殊变量。以下介绍几个常用的:

  1.__str__

    在这个方法中返回合适的字符串,就完成了python的toString()了:

class Person(object):
def __init__(self, name):
self.__name = name def __str__(self):
return "这是toString(),name是:" + self.__name print(Person("江北"))

    这样直接打name出来的也是不美化的,解决方式是再定义一个方法,偷懒的写法如下;

__repr__ = __str__

  2.__iter__

    要像list那种用于for .. in xx中,需要实现__iter__并返回迭代对象

  3.__getattr__

    用于获取属性,例如类中不存在这个属性时,则Python会尝试去调用__getattr__去获取(存在时正常调用):

class Person(object):
def __init__(self, name):
self.__name = name def __str__(self):
return "这是toString(),name是:" + self.__name def __getattr__(self, item):
if item == "age":
return 18 print(Person("江北").age)

    // 实际应用参考廖老师博客

  4.__call__

    用来调用类似以下的情况:

p = Person("江北")
p()

    这种直接调用实例()方法,类似scala中的apply(),Python中使用如下:

class Person(object):
def __init__(self, name):
self.__name = name def __call__(self, *args, **kwargs):
print("call被调用,携带参数为:" + args[0]) p = Person("江北")
p("abc")

    // __call__可以携带参数,也可以不携带参数

五、枚举类

  直接看两种定义方法

from enum import Enum

Month = Enum("Month", ("JAN", "FEB")) # value默认从1开始计数

class M(Enum):
JAN = 0 # 设置value为0
FEB = 1

  更多,参考:https://www.cnblogs.com/xiexiaoxiao/p/7100950.html

六、元类

  1.使用type()动态创建类

Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class

要创建一个class对象,type()函数依次传入3个参数:

  1. class的名称;
  2. 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
  3. class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。

  2.metaclass元类

    元类就是创建类的类。元类和类的关系,类似于类和实例的关系

    让人头大的这一块就不在入门阶段介绍了(就像动态代理,平时也很少写到)。有增强篇时再做介绍

最新文章

  1. js中的运算总结(未完待续
  2. Windows平台下Qt中glut库的使用
  3. SimpleDateFormat
  4. objcopy
  5. Spark实践的阶段性总结
  6. 2014.3.6-C语言学习小结
  7. Self Numbers
  8. 【python之路11】集合数据类型(set)
  9. 看Lucene源码必须知道的基本规则和算法
  10. Socket实现-Socket I/O
  11. 关于破解visualsvn 我这里是版本是5.2.1
  12. mysql学习二、SQL常用数据类型
  13. Coursera Deep Learning 3 Structuring Machine Learning Projects, ML Strategy
  14. python全栈开发day51-jquery插件、@media媒体查询、移动端单位、Bootstrap框架
  15. Check the NativeLink log file
  16. LinkedIn实时低延迟数据抓取系统Databus开源
  17. matlab 将一堆文件名读到一个文本里面windows版本里
  18. sublime text2下配置c++
  19. Android中9-Patch图片之理解
  20. android intent 传递 二进制数据

热门文章

  1. 安装vs2008出现MSI returned error code 1603的错误的解决
  2. Android--仿1号店继续拖动查看图文详情——一个自定义的ViewGroup
  3. Express4.X中的bin/www是作什么用的?为什么没有后缀?
  4. android 解决连接电视机顶盒失败的方法
  5. 【python】python中的json、字典dict
  6. 为MySQ启用HugePage
  7. MFC 常用功能总结
  8. Hash问题----Hash强碰撞
  9. 聊聊MySQL的子查询
  10. Python接口自动化--Json数据处理 5