1、组合,将几个横向关系的组合在一起。所谓的组合就是将类的实例化放到新类里面,那么就将旧类组合进去了。

class Turtle:def __init__(self, x):          # 注意 init 前面必须双下划线self.num = xclass Fish:def __init__(self, x):self.num = xclass Pool:def __init__(self, x, y):self.turtle = Turtle(x)        # Pool类中实例化Turtle对象self.fish = Fish(y)def print_num(self):print('水池中共有乌龟 %d 只,小鱼 %d 条!'%(self.turtle.num,self.fish.num))

  调用结果:

pool = Pool(2, 7)
>>> pool.print_num()
水池中共有乌龟 2 只,小鱼 7 条!

  **:在新类中实例化旧类,如:self.turtle = Turtle(x) ,个人理解为将 Turtle 对象传递给 self.turtle 对象(属性),然后self.turtle 对象就具有Turtle 对象的属性了(体现在实例化 Pool 对象后,可以调用self.turtle.num,num 在 Pool 类中是没有定义的)。

  2、Mixin 简介

Mixin 编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是有类的继承机制就可以实现,然而这与传统的类继承有所不同。通常 Mixin 并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用。

特点

使用 Mixin 机制有如下好处:

  • 可以在不修改任何源代码的情况下,对已有类进行扩展;
  • 可以保证组件的划分;
  • 可以根据需要,使用已有的功能进行组合,来实现“新”类;
  • 很好的避免了类继承的局限性,因为新的业务需要可能就需要创建新的子类。

多继承

Python支持多继承,即一个类可以继承多个子类。可以利用该特性,可以方便的实现mixin继承。如下代码,类A,B分别表示不同的功能单元,C为A,B功能的组合,这样类C就拥有了类A, B的功能。

class A:def get_a(self):print 'a'
class B:def get_b(self):print 'b'
class C(A, B): pass
c = C()
c.get_a()
c.get_b()

__bases__

多继承的实现就会创建新类,有时,我们在运行时,希望给类A添加类B的功能时,也可以利用python的元编程特性,__bases__属性便在运行时轻松给类A添加类B的特性,如下代码:

A.__bases__ += (B,)
a.get_b()

其实__bases__也是继承的机制,因为__bases__属性存储了类的基类。因此多继承的方法也可以这样实现:

class C:pass
C.__bases__ += (A, B, )

插件方式

以上两种方式,都是基于多继承和python的元编程特性,然而在业务需求变化时,就需要新的功能组合,那么就需要重新修改A的基类,这回带来同步的问题,因为我们改的是类的特性,而不是对象的。因此以上修改会对所有引用该类的模块都收到影响,这是相当危险的。通常我们希望修改对象的行为,而不是修改类的。同样的我们可以利用__dict__来扩展对象的方法。

class PlugIn(object):def __init__(self):self._exported_methods = []def plugin(self, owner):for f in self._exported_methods:owner.__dict__[f.__name__] = fdef plugout(self, owner):for f in self._exported_methods:del owner.__dict__[f.__name__]
class AFeature(PlugIn):def __init__(self):super(AFeature, self).__init__()self._exported_methods.append(self.get_a_value)def get_a_value(self):print 'a feature.'
class BFeature(PlugIn):def __init__(self):super(BFeature, self).__init__()self._exported_methods.append(self.get_b_value)def get_b_value(self):print 'b feature.'
class Combine:pass
c = Combine()
AFeature().plugin(c)
BFeature().plugin(c)
c.get_a_value()
c.get_b_value()

  

  3、类、类对象、实例对象

 class C:count = 0>>> a = C()
>>> b = C()
>>> c = C()>>>a.count0
>>> c.count += 10
>>> a.count
0
>>> b.count
0
>>> C.count += 100
>>> a.count
100
>>> b.count
100
>>> c.count
10

                              

  1)python中无处不对象。类中定义的属性时静态属性,类属性和类对象是绑定的,不依赖于实例对象。

  2)实例化对象后,进行实例对象属性的修改不会影响类对象的属性,所以 c.count += 10不会影响 C.count 的值。

  3)修改类对象属性属性之后,实例化对象的属性也会跟着改变,注意,经过实例对象修改过的属性不随着类属性的改变而改变(见上边染色部分代码),原因:个人理解为此处类似变量间的复制,实例对象是一个标签,和类对象指向同一个类属性地址,所以:a)类属性改变,实例对象属性跟着改变;b)单独修改实例对象属性是从新开辟堆栈,覆盖了该实例对象原本的类属性,所以这个修改不影响类属性,修改类属性也不影响经过修改的实例对象属性。

  4、如果属性名称和方法名称一样,属性名称会覆盖方法名称。如下:给实例对象 c 定义 x 属性之后,再调用 x() 方法会报错。

  4、绑定:Python 严格要求方法需要有实例才能够被调用,这种限制就是绑定概念。 个人理解:当实例对象调用方法时,会默认再方法里加一个 self 参数,如下面调用 bb.printBB()报错是因为 python默认的调用方式是 bb.printBB(bb),而 class BB 的printBB() 方法里面没有 self 参数,所以出现:TypeError :...but 1 was given 这个报错。

  下面这段代码验证上面的个人理解。

 class BB:def printBB(self):print('BB')>>> a = BB()
>>> a.printBB()
BB
>>> BB.printBB()
Traceback (most recent call last):File "<pyshell#35>", line 1, in <module>BB.printBB()
TypeError: printBB() missing 1 required positional argument: 'self'
>>> BB.printBB('b')
BB

  5、查看对象属性:对象.__dict__

   

转载于:https://www.cnblogs.com/Chris-01/p/10310739.html

组合,Mixin,类、类对象、实例对象相关推荐

  1. java类和对象实例对象_Java类、对象和实例的理解

    最近在看Python,这门面向对象的语言又引起了类的引用.对象和实例这些概念之间的纠结,我按照自己的理解总结了一下Java里三者的关系,如果有不对的地方还希望大家指出. 类的引用和对象的概念没什么好弄 ...

  2. 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)

    27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...

  3. 类属性和实例属性的区别

    先看图理解: 类属性就相当与全局变量,实例对象共有的属性,实例对象的属性为实例对象自己私有. 类属性就是类对象(Tool)所拥有的属性,它被所有类对象的实例对象(实例方法)所共有,在内存中只存在一个副 ...

  4. 面向过程和面向对象的编程思想 复习原型 构造函数和实例对象和原型对象之间的关系

    体会面向过程和面向对象的编程思想 <!DOCTYPE html> <html lang="en"> <head><meta charset ...

  5. python的类和对象例题_Python类、类对象和实例对象、组合、绑定详细讲解

    目录: 一.组合 二.类.类对象和实例对象 三.到底什么是绑定 四.课时39课后习题及答案 *********** 一.组合 *********** 现在要求定义一个类,叫水池,水池里要有乌龟和鱼. ...

  6. python的类和对象_Python面向对象之类和对象实例详解

    本文实例讲述了Python面向对象之类和对象.分享给大家供大家参考,具体如下: 类和对象(1) 对象是什么? 对象=属性(静态)+方法(动态): 属性一般是一个个变量:方法是一个个函数: #类的属性 ...

  7. 【C++学习】类与对象(一)——类的定义与对象实例

    一.面向对象程序设计的基本特点 1.1 抽象 面向对象方法中的抽象 ,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程. 一个问题的抽象包括:数据抽象和行为抽象(或被称为功能抽象 ...

  8. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  9. Python面对对象编程——对象、类详解及实例

    Python中类与对象的初认识 1.Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的 ...

最新文章

  1. 聊聊 iOS 中的网络加密
  2. leetcode 22. 括号生成
  3. sql里查询一个组和组的用户数怎么查?_【牛客网SQL刷题】留存率怎么算?
  4. 如何在Jupyter Notebook中使用在anaconda中创建的虚拟环境
  5. serverlet生命周期
  6. js rsa java解密_JS-RSA加密解密
  7. 监视Python程式自动退出,并重新启动程式
  8. strlen源码分析
  9. 新卡插手机显示无服务器,手机插卡无服务怎么回事
  10. Tomcat的appBase与docBase的区别
  11. 关于医院精确套打发票的实现
  12. [置顶] Android九环刀之RatingBar之评委请亮分
  13. NYOJ 首字母变大写
  14. 【深度学习NLP论文笔记】《Deep Text Classification Can be Fooled》
  15. python程序设计与算法基础第二版课后答案_python算法与程序设计基础答案
  16. 诺基亚社招C++面试记录
  17. Windows实现快捷键熄屏功能
  18. 解决matlab错误使用 mex 未找到支持的编译器或 SDK一系列问题
  19. Mysql解决中文乱码
  20. Python scrapy学习之爬取2k唯美壁纸详细过程笔记及讲解

热门文章

  1. CPU GPU设计工作原理《转》
  2. IPS不用添加service帐号进入linux使得管理主机能访问的方法
  3. juniper srx 3400 双机 配置
  4. JQuery EasyUI DataGrid
  5. windows7下bcdedit出现“拒绝访问”解决办法
  6. 变电站接地网的优化设计22437
  7. python 多线程就这么简单
  8. linux egrep和grep区别,linux中grep和fgrep有什么区别
  9. 1093 字符串A+B (20 point(s)) - PAT乙级真题
  10. 1076. Wifi密码 (15)-PAT乙级真题