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

实例化对象绑定属性

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 (查漏补缺)

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

时间: 2024-11-08 18:58:00

python基础-面向对象高级编程的相关文章

python基础--面向对象高级、异常处理、网络编程

一.面向对象高级 1.接口与归一化设计 接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类(B)继承后,由 类B去实现其中的某个功能或全部功能. 在python中接口由抽象类和抽象方法去实现,接口是不能被实例化的,只能被别的类继承去实现相应的功能 归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度. 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的

Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1)   静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法.普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访

python 之面向对象高级编程

数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>&

Python之路,Day8 - Python基础 面向对象高级进阶与socket基础

类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province: # 静态字段 country = '中国'def __init__(self, name): #

python Class: 面向对象高级编程 __iter__ 和 next()

官网解释: New in version 2.2. iterator.__iter__() Return the iterator object itself. This is required to allow both containers and iterators to be used with the for and instatements. This method corresponds to the tp_iter slot of the type structure for P

Python学习---面向对象高级编程

Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性: class Student(object): __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的.除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__. Python

python之面向对象高级编程

@property: 既能检查参数,又可以用类似属性这样简单的方式来访问类的变量,可以让调用者写出简短的代码 class Student(object): #birth是可读写属性(多定义了一个setter的装饰器),而age就是一个只读属性 @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value @property def age(self):

【Python】[面向对象高级编程] 使用__slots__,使用@property

1.使用 __slots__    给实例绑定方法, >>> def set_age(self, age): # 定义一个函数作为实例方法 ... self.age = age ... >>>from types import MethodType >>>s.set_age=MethodType(set_age,s) >>>s.set_age(25) >>>s.age 25 为了给所有的实例都绑定方法,可以给类绑定方

Python3 面向对象 高级编程

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.  class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 还可以尝试给实例绑定一个方法: >>> def set_age(self, age): # 定义一个函数作为实例方法 ...