一、使用__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元类

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

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

Python3入门(九)——面向对象OOP高级编程的更多相关文章

  1. Python 面向对象之高级编程

    7.面向对象高级编程 7.1使用__slots__ python动态语言,new 对象后绑定属性和方法 Tip:给一个实例绑定的方法,对其他对象无效.可以通过对class绑定后,所有对象可以调用该方法 ...

  2. web入门之十 JS高级编程基础

    学习内容 JavaScript函数 JavaScript类和对象 解析JSON数据 能力目标 深入了解JavaScript函数 熟悉JavaScript面向对象编程 熟练进行JSON数据解析 本章简介 ...

  3. Python面向对象的高级编程

    数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ ...

  4. 面向对象的高级编程&IO编程

    1.给类对象绑定的函数,只对这个对象生效, 而对类绑定的对象, 所有的对象都可以调用. 栗子: def set_score(self, score): self.score = score s.set ...

  5. Python3入门(十一)——IO编程

    一.文件读写 python的文件操作和C是兼容的 1.读文本文件 读文件操作如下: f = open("F:/1.txt", "r") data = f.rea ...

  6. ES6入门九:Symbol元编程

    JS第七种数据类型:Symbol Symbol的应用场景 11个Symbol静态属性 Symbol元编程 一.JS第七种数据类型:Symbol 在ES6之前的JavaScript的基本数据类型有und ...

  7. Python3入门(六)——函数式编程

    一.高阶函数 1.可以通过变量指向函数,达到类似别名的效果: >>> f = abs >>> f(-10) 10 2.函数的参数可以是函数,也就是函数可以作为一个入 ...

  8. Python3入门(五)——高级特性

    一.切片 对于取指定索引的值,python提供了切片来简化傻傻的循环 list2 = ["apple", "water", "banana" ...

  9. PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...

随机推荐

  1. MyEclipse中搭建Struts2开发环境

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53205941 冷血之心的博客) 在MyEclipse中如何搭建St ...

  2. Expo大作战(五)--expo中app.json 文件的配置信息

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  3. LeetCode题解之Maximum Depth of N-ary Tree

    1.题目描述 2.问题分析 利用递归fangf 3.代码 int maxDepth(Node* root) { int res = maxdep(root); return res; } int ma ...

  4. Oracle EBS GL总账凭证取值

    SELECT gh.je_header_id, gh.period_name, gh.default_effective_date, gh.je_source, gs.user_je_source_n ...

  5. MySQL crash-safe replication(1)

    MySQL 5.6 对复制功能提供了新特性:slave 支持 crash-safe,可以解决之前版本中系统异常断电可能导致的 SQL thread 信息不准确的问题. 原文:Enabling cras ...

  6. [Spark Core] Spark 核心组件

    0. 说明 [Spark 核心组件示意图] 1. RDD resilient distributed dataset , 弹性数据集 轻量级的数据集合,逻辑上的集合.等价于 list 没有携带数据. ...

  7. 在 Virtual Box 中为 CentOS7 mini 配置双网卡

    1. 配置过程 1.1 需求分析 要同时满足虚拟机访问互联网和远程连接,需要配置两块网卡. 一块为 NAT 网络,这块用来访问互联网. 另一块为 Host-Only 网络,进行远程连接.   1.2 ...

  8. pt-heartbeat工具监控MySQL复制延迟

    pt-heartbeat工作原理: 1,在主库上的某个数据库A中创建一张heartbeat表,按照一定的时间频率更新该表的字段(把时间更新进去). 2,从主库连接到从上的这个数据库A中检查复制的时间记 ...

  9. 3.1Python的判断选择语句

    返回总目录 目录: 1.if单分支语句 2.if else 双分支语句 3.if elif ...else多分支语句 4.if 嵌套语句 判断语句总览: (一)if单分支语句: 语法: if 条件: ...

  10. 【Alpha 冲刺】 6/12

    今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 建立数据库 未完成 表结构文档已设计好,服务器mysql刚配置完成,但是,SpringMVC框架还没有熟络,不清楚如何使用该框架去 ...