7.面向对象高级编程

7.1使用__slots__

python动态语言,new 对象后绑定属性和方法

Tip:给一个实例绑定的方法,对其他对象无效。可以通过对class绑定后,所有对象可以调用该方法

如果我们现在只有实例可以添加属性,使用__slots__,只允许对Student实例添加name和age属性,

添加其他属性报错

class Student(object):

__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

该限定只对当前对象起作用,其子类不做限定

-----------

7.2 @property  简短的代码又可检查参数得正确性

class Student(object):

def get_score(self):

return self._score

def set_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 = value

--------------------

class Student(object):

@property

def score(self):

return self._score

@score.setter

def 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 = value

#。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了

另一个装饰器@score.setter,  负责把一个setter方法变成属性赋值

------------------

7.3多重继承

类的继承问题http://python.jobbole.com/85685/

class Dog(Mammal, RunnableMixIn, CarnivorousMixIn):

pass

---------

7.4 定制类

__iter__

class Fib(object):

def __init__(self):

self.a, self.b = 0, 1 # 初始化两个计数器a,b

def __iter__(self):

return self # 实例本身就是迭代对象,故返回自己

def __next__(self):

self.a, self.b = self.b, self.a + self.b # 计算下一个值

if self.a > 100000: # 退出循环的条件

raise StopIteration()

return self.a # 返回下一个值

for n in Fib()

print(n)

----------

7.5 枚举类

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)

Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。

-----------------

7.6使用元类

type() ;

#动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。

先定义metaclass,就可以创建类,最后创建实例。?完全看不懂

最新文章

  1. Json序列化与反序列化
  2. JavaScript作用域原理(一)——作用域链
  3. zip压缩与解压缩示例
  4. 使用cocoapods导入第三方类库后 头文件没有代码提示?
  5. 渲染引擎之Camera
  6. Microsoft Visual Studio 2013 VSTS单元测试指南
  7. data-属性
  8. windows-ubuntu环境变量的设置格式的不同
  9. Swift - 02 - 常量和变量
  10. 点评阿里JAVA手册之异常日志(异常处理 日志规约 )
  11. WPF多屏最大化
  12. PHP学习笔记 ThinkPHP
  13. 音频标签化2:youtube-8m项目的训练、评估与测试
  14. 学习笔记:Highcharts
  15. whereis+whatis+man
  16. 删除草稿信息之后 threads表的数据没有发生变化
  17. springboot项目启动报错
  18. [Android Tips] 31.如何将第三库引入的 Permission 删除掉
  19. Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in
  20. 浅析GitLab Flow的十一个规则

热门文章

  1. 数据可视化之PowerQuery篇(七)Power Query应用技巧:批量更改列名
  2. Linux02 /Linux命令简单使用
  3. 三、Python系列——Pandas数据库读取数据
  4. OSCP Learning Notes - WebApp Exploitation(4)
  5. springboot+redis做事件过期通知业务
  6. node的async模块
  7. centos7.5安装gdal编译环境
  8. MySQL组复制MGR(四)-- 单主模式与多主模式
  9. raw目录的位置是D:\android_projects\qrscan\app\src\main\res\raw
  10. IDEA中项目的两种打包方式