码迷,mamicode.com
首页 > 编程语言 > 详细

python基础-面向对象高级编程

时间:2018-08-06 14:39:04      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:code   UNC   nbsp   检查   __init__   内存   图片   分享图片   没有   

实例化对象绑定属性

s.name = ‘Michael‘ # 动态给实例绑定一个属性

类绑定方法---所有实例化对象均可调用
Student.set_score = set_score

实例化对象绑定方法---只有该对象可调用
from types import MethodType#绑定方法需要使用MethodType
s.set_age = MethodType(set_age, s) # 给实例绑定一个方法

Python内置的@property装饰器就是负责把一个方法变成属性调用的
把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作

Python允许使用多重继承,因此,MixIn就是一种常见的设计。
只允许单一继承的语言(如Java)不能使用MixIn的设计

 

如果查看内置函数的源码?比如len()的源码,为什么一个对象可以使用len()就必须在该对象的类的内部定义__len__方法

 

枚举类 Enum
@unique装饰器可以帮助我们检查保证没有重复值。

 

使用type()创建一个class对象,依次传入3个参数:(可以动态生成class)
class的名称;
继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。
Foo = type(‘Foo‘,(object,), {‘func‘: func})

技术分享图片
>>> def fn(self, name=world): # 先定义函数
...     print(Hello, %s. % name)
...
>>> Hello = type(Hello, (object,), dict(hello=fn)) # 创建Hello class
>>> h = Hello()
>>> h.hello()
Hello, world.
>>> print(type(Hello))
<class type>
>>> print(type(h))
<class __main__.Hello>
type创建对象简单示例

 

技术分享图片
class mytype(type):#创建超级类type的子类mytype
    def __init__(self,*args,**kwargs):#type里的self相当于foo类;这与其他的子类父类的self就是类的对象不一样
        print(123,创建foo类(定义类)时执行)
    def __call__(self, *args, **kwargs):
        print(mytype__call__,1.foo类创建对象时,foo(),foo作为type的对象,foo()执行type中的__call__();同时__call__调用foo类的__new__()方法)
        self.__new__(fds)#其实对象是在__new__()方法中创造的
        self.__init__()#执行foo类的__init__()方法
class foo(object,metaclass=mytype):#创建类时,修改为使用mytype来创建
    def __init__(self):
        print(foo__init__)
    def __new__(cls, *args, **kwargs):
        print(foo__init__)
        return 对象#其实对象是在__new__()方法中创造的


f = foo()#之前的说法:类名()执行类的__init__()方法
#其实中间还经历了几个步骤
#1.foo是类名,但也是作为type类的对象,所以对象()执行type中的__call__()方法
#2.执行type的__call__()会调用foo类中的__new__方法---创建foo类对象
#3.执行type的__call__()会调用foo类中的__init__方法
type创建class的过程

技术分享图片

 

单例模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!!!
创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.dl() 。
本质其实就是定义一个静态方法,判断是否已经存在单例对象,若有则直接返回单例对象,若没有,则创建单例对象,再返回单例
对象



 

 最后则是特殊变量的说明

 

 

 


廖雪峰-面向对象高级编程-使用元类-metaclass及自定义ORM框架-待复习
http://www.cnblogs.com/wupeiqi/p/4766801.html
https://www.cnblogs.com/maskice/p/6493404.html (查漏补缺)

python基础-面向对象高级编程

标签:code   UNC   nbsp   检查   __init__   内存   图片   分享图片   没有   

原文地址:https://www.cnblogs.com/AllenWoo/p/9429826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!