面向对象操作进阶

__setitem__ __getitem__ __delitem__把对象操作属性模拟成字典的格式:

class Foo:
    def __init__(self,name):
        self.name=name

    def __getitem__(self, item):
        print(self.__dict__[item])

    def __setitem__(self, key, value):
        self.__dict__[key]=value
    def __delitem__(self, key):
        print(‘del obj[key]时,我执行‘)
        self.__dict__.pop(key)
    def __delattr__(self, item):
        print(‘del obj.key时,我执行‘)
        self.__dict__.pop(item)

f1=Foo(‘sb‘)
f1[‘age‘]=18
f1[‘age1‘]=19
del f1.age1
del f1[‘age‘]
f1[‘name‘]=‘alex‘
print(f1.__dict__)

>>>:
del obj.key时,我执行
del obj[key]时,我执行
{‘name‘: ‘alex‘}


__slots__:

由类产生的对象不再产生自身名称空间,可以节省内存,也可以限定产生的属性。


class Foo:
    __slots__=[‘name‘,‘age‘,‘sex‘]  #限定绑定的对象只有3个属性

p = Foo()
p.age = 18
# print(p.__dict__)  #打印p对象字典会报错,提示‘Foo‘ object has no attribute ‘__dict__‘
p.sex = ‘male‘
p.name = ‘Mitsui‘
print(p.name,p.sex,p.age)


__next__和__iter__:(实现迭代器协议)

class My_range:
    def __init__(self,start,end):
        self.start = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        n = self.start
        self.start += 1
        if n == self.end:
            raise StopIteration
        return n

f = My_range(1,10)
for i in f:
    print(i)

__doc__: 查看注释信息 无法被继承

__module__ 表示当前操作的对象在那个模块

__class__     表示当前操作的对象的类是什么

__del__ 析构方法,当对象在内存中被释放时,自动触发执行。

class Foo:

    def __del__(self):
        print(‘执行我啦‘)

f1=Foo()
del f1
print(‘------->‘)

>>>>:
执行我啦     #del 对象被释放,所以运行了里面的print
------->        #如果没有del f1 则会先运行------>然后整个程序运行结束 也会打印__del__里面 ‘执行我啦’。

__enter__和__exit__:

import time
class Open:

    def __init__(self,filepath,mode=‘r‘,encode=‘utf8‘):
        self.f = open(filepath,mode=mode,encoding=encode)
    def __enter__(self):
        return self  #(‘出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量‘)  #这里return self 而不是self.f 是因为self.f是原本open功能的句柄,return self.f 下面引用f.write 将是应用原本文件写功能,而不是自己定制的write,所以return self 赋给 f,f.write则会调用自己定制的write

    def write(self, line):  # 定制自己的文件写功能
        print(‘f自己的write‘,line)
        t=time.strftime(‘%Y-%m-%d %X‘)          #得到一个格式输出的时间 年Y月m日d 时分秒X
        self.f.write(‘%s %s‘ %(t,line))
    def __getattr__(self, item):
        return getattr(self.f,item)

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()  #with 代码结束时执行,仿原本的with open 起到一个关闭文件的作用

with Open(‘b.txt‘,‘w+‘)as f:
    f.write(‘自己的日志写功能‘)
    f.seek(0)
    print(f.read())

1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预

2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处

__call__

构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
    def __init__(self):
        pass
    def __call__(self, *args, **kwargs):
        print(‘__call__‘)

obj = Foo()
obj() #对象加()触发__call__  打印输出“__call__”

metaclass:

1.首先看看一个类是如何生成的:

 1 # 自定义一个类:
 2 def run(self):
 3     print(‘%s is running‘ % self.name)  #定义一个函数run
 4 class_name = ‘Foo‘    #定义类名
 5 class_dic={         #定义类里边的__dic__ 参数
 6     ‘name‘:‘Mitsui‘,
 7     ‘run‘:run
 8 }
 9 bases = (object,)
10 Foo = type(class_name,bases,class_dic)    #type手动创建一个类            
 
时间: 2024-10-06 01:10:08

面向对象操作进阶的相关文章

Python基础-第七天-面向对象编程进阶和Socket编程简介

本篇内容: 1.面向对象编程进阶-静态方法 2.面向对象编程进阶-类方法 3.面向对象编程进阶-属性方法 4.面向对象编程进阶-特殊成员(内置方法) 5.面向对象编程进阶-反射 6.异常处理.断言 7.Socket编程简介 一.面向对象编程进阶-静态方法 1.静态方法的实现 通过@staticmethod装饰器可以把其装饰的方法变为一个静态方法: 变成静态方法后,形参中可以不用写self了.如果写了self,默认是不会把对象本身传递给self,需要手动传递: class Dog(object):

[.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术

[.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率. 本节将介绍如何利用缓存写出高效率的代码. 1. 什么是缓存(Cache)? 缓存(Cache)是一种用空间换取时间的技术 存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取. 比如CPU二级缓存.内存.windows文件读取缓存. 2. .NE

进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 要在类中使用静态方法,需在类成员函数前面加上@staticmethod标记符,以表示下面的成员函数是静态函数.使用静态方法的好处是,不需要定义实例即可使用这个方法.另外,多个实例共享此静态方法. 类方法 类方法与普通的成员函数和静态函数有不同之处,在接触的语言中好像也没见过这种语义,看它的定义: 

[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 http://www.cnblogs.com/yubinfeng/p/5182271.html 本篇导读: 上篇介绍了一款Windows环境下的Git服务器工具GitStack ,搭建了最简单的Windows下的Git服务器,需要再次提醒的是

[.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上)

[.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上) 本篇导读: 上篇介绍了常用的代码管理工具VSS,看了一下评论,很多同学深恶痛绝,有的甚至因为公司使用VSS离职的.其实使用什么代码管理工具要看项目而定.毕竟使用何用代码管理工具,是项目管理者根据需要来决定的,如果你是一个开发人员,首先要让自己的技术精进一点.下面根据我个人理解,把这几种常见的代码管理工具使用场景简单介绍一下. 1.几种代理管理工具的适用场景 A.如果你的项目是5-6人的小团队,那么使用

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类 本节导读:本节主要介绍通过序列化接口IXmlSerializable实现XML序列化和反序列化,整理了XML基础操作及序列化的通用类(包括XML及节点的基础读写操作,XML到DataSet\DataTable互转换操作,XML序列化及反序列化通用方法等). 读前必备: A.类和类的实例 [.net 面向对象编程基础]  (9) 类和类的

[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 多线程高级应用

[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 多线程高级应用 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET多线程中的高级应用. 主要有在线程资源共享中的线程安全和线程冲突的解决方案:多线程同步,使用线程锁和线程通知实现线程同步. 1. ThreadStatic特性 特性:[ThreadStatic] 功能:指定静态字段在不同线程中拥有不同的值 在此之前,我们先看一个多线程的示例: 我们定义一个静态字段: static

[.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 使用多线程提高程序性能

[.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 使用多线程提高程序性能 本节导读: 多线程(Multithreading)使我们程序可以同时进行多任务处理,直接提高了程序的执行效率,学习多线程对提高程序运行能力非常必要,本节主要介绍多线程原理及.NET中多线程的应用. 1. 关于多线程 在介绍多线程之前,先了解一下进程. 进程:独立运行的程序称为进程.(比如Windows系统后台程序,也可以称为后台进程) 线程:对于同一个程序分为多个执行流,称为线程.

[.net 面向对象程序设计进阶] (2) 正则表达式(一)

[.net 面向对象程序设计进阶] (2) 正则表达式(一) 1.什么是正则表达式? 1.1正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简写为regex.regexp或RE),是计算机科学的一个重要概念.他是用一种数学算法来解决计算机程序中的文本检索.区配等问题. 1.2正则表达式语言支持  正则表达式其实与语言无关,在很多语言中都提供了支持 ,包括最常用的脚本语言Javascript.当然C#语言也毫不例外的提供了很好的支持.     正则表达式语