Python面向对象进阶之高级编程

__slots__:定义类时,使用__slots__变量可以限制能添加的实例的属性

形如:__slots__ = [‘name‘,‘age‘]

这样实例化的对象只能绑定到name和age属性,其他属性则无法被绑定

class People:
    __slots__ = [‘name‘,‘age‘]
    def __init__(self,name,age):
        self.name = name
        self.age = age
p = People(‘laowang‘,18)
print(p.name)
p.sex = ‘male‘
print(p.sex)

执行结果:

laowang

Traceback (most recent call last):

  File "C:/", line 43, in <module>

    p.sex = ‘male‘

AttributeError: ‘People‘ object has no attribute ‘sex‘

可以看出name属性初始化成功并且可以访问,但是sex属性无法添加

__call__方法:只要定义类型的时候,实现__call__函数,这个类型就成为可调用的

class People:
    def __init__(self,name):
        self.name=name
    #
    def __call__(self, *args, **kwargs):
        print(‘call‘)
    #
p=People(‘egon‘)
print(callable(People))
print(callable(p))
p()

执行结果为:

True

True

call

意味着People及其产生的对象均为可调用的,并且:对象()会执行__call__方法

__getitem__、__setitem__、__delitem__方法:提供以字典的方式操作对象属性

class Foo:
    def __init__(self,name):
        self.name=name
    def __getitem__(self, item):
        # print(‘getitem‘,item)
        return self.__dict__[item]
    def __setitem__(self, key, value):
        print(‘setitem-----<‘)
        self.__dict__[key]=value
    def __delitem__(self, key):
        self.__dict__.pop(key)
        # self.__dict__.pop(key)
    # def __delattr__(self, item):
    #     print(‘del obj.key时,我执行‘)
    #     self.__dict__.pop(item)
f=Foo(‘egon‘)
f[‘name‘]=‘egon‘
print(f.name)
f[‘age‘]=18
print(f.__dict__)
del f[‘age‘]

__iter__、__next__方法:可以实现一个迭代器协议,类定义中加入这两个方法可以将类实例化的对象变为可迭代的对象

需要注意下的就是__next__中必须控制iterator的结束条件,不然就死循环了

下例利用此原理实现了一个简单的range()函数的功能

class Range:
    def __init__(self,start,stop):
        self.start = start
        self.stop = stop
        pass
    def __iter__(self):
        return self
    def __next__(self):
        if self.start >= self.stop:
            raise StopIteration
        n = self.start
        self.start += 1
        return n

for i in Range(1,10):
    print(i)

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

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

class Open:
    def __init__(self,filepath,mode=‘r‘,encode=‘utf-8‘):
        self.f=open(filepath,mode=mode,encoding=encode)
    def write(self):
        pass
    def __getattr__(self, item):
        return getattr(self.f,item)
    def __del__(self):
        print(‘----->del‘)
        self.f.close()
f=Open(‘a.txt‘,‘w‘)
f1=f
del f
print(‘=========>‘)

__enter__、__exit__方法:实现上下文管理协议,即with语句,这个跟文件操作时使用with语句一样:

with open(‘filepath/filename‘,‘r‘,encoding=‘utf-8‘) as f:
        ‘代码块‘

在类定义时定义__enter__、__exit__方法可以让类产生的对象使用with语句

class Foo:
    def __enter__(self):
        print(‘=====》enter‘)
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(‘exit‘)
        print(‘exc_type‘,exc_type)
        print(‘exc_val‘,exc_val)
        print(‘exc_tb‘,exc_tb)
        return True

with Foo() as obj: #res=Foo().__enter__() #obj=res
    print(‘with foo的自代码块‘,obj)
    raise NameError(‘名字没有定义‘)
    print(‘************************************‘)
print(‘------>‘)

__exit__()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行,但是__exit__如果有返回值,则with语句块之外的代码可以正常执行

__str__方法:当类的方法被调用时,会调用此方法返回一个字符串(为了好看与打印相关重要信息)

元类:

关于元类的详细讲解可参阅此文:深刻理解Python中的元类(metaclass)

时间: 2024-10-28 10:10:35

Python面向对象进阶之高级编程的相关文章

Python面向对象进阶和socket网络编程-day08

写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self,name): self.name=name p = Chinese('standby') # 实例化一个对象 print(p) # 打印这个对象 --- <__main__.Chinese object at 0x0000000000B3A978> - 示例2: >&g

python 面向对象基础和高级复习

面向对象基础 面向对象编程 面向过程编程:类似于工厂的流水线 优点:逻辑清晰 缺点:扩展性差 面向对象编程:核心是对象二字,对象属性和方法的集合体,面向对象编程就是一堆对象交互 优点:扩展性强 缺点:逻辑非常复杂 类与对象 对象:属性和方法的集合体 类:一系列相同属性和方法的集合体 现实世界中先有对象后有类,python中先有类,再实例化出对象 对象的属性的查找顺序 先对象本身-->类-->父类-->父类的父类-->object-->自己定制的元类-->type 给对象

python面向对象进阶版

面向对象基础知识: 1.面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 2.类是一个模板,模板中包装了多个'函数'供使用(可以将多函数中公用的变量封装到对象中): 3.对象,根据模板创建的实例(即:对象),实例用于被包装在类中的函数: 4.面向对象三大特性:封装.继承和多态. 面向对象进阶篇详细介绍python类的成员.成员修饰符和类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存

python面向对象进阶(八)

上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象

python面向对象进阶

isinstance(obj,cls)检查是否obj是否是类 cls 的对象. isinstance(obj,cls)检查是否obj是否是类 cls 的对象. 反射 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数(参数是对象,字符串格式的属性名) hasattr getattr setattr delattr __del__,就是析构方法,当对象在内存中被释放时,自动触发执行. 注:此方法一般无须定义,

python 面向对象 进阶篇

在上篇<python面向对象>中,简单介绍了python中面向对象的基本知识 在这篇博客中,详细介绍python类的成员,成员修饰符,类的特殊成员. 类的成员 类的成员分为三种:字段,方法和属性 所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 字段 字段包括普通字段和静态字段.静态字段,保存在类中.普通字段,保存在对象中. class FOO: country = “中国

Python 面向对象进阶

1 isinstance 和issubclass instance:判断该对象是否是类的对象 isinstance(obj,Foo) x = [] print(isinstance(x,list)) 结果:True issubclass:判断是否是继承 class Foo: pass class Bar(Foo): pass print(issubclass(Bar,Foo)) 结果:True 通过下面的方式也可以查看print(Bar.base) 2 反射 反射是Smi首次提出的,主要指程序可

Python之路-python(面向对象进阶)

一.面向对象高级语法部分 1.静态方法.类方法.属性方法 2.类的特殊方法 3.反射 二.异常处理 三.Socket开发基础 一.面向对象高级语法部分 静态方法(@staticmethod) 定义:只是名义上归类管理,实际上在在静态方法里面访问不了类或实例中的属性 1 class Dog(object): 2 def __init__(self,name): 3 self.name = name 4 5 @staticmethod 6 def eat(x,s): 7 print("%s is e

Python面向对象进阶及类成员

再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A:    def bar(self):        print("BAR")        self.f1() class B(A):    def f1(self):        print("B") class C:    def f1(self):        print("C") class D(C,