Python学习笔记(二十五)——第四十六、四十七、四十八讲

 

0、描述符就是一个类,一个至少实现__get__()、__set__()、__delete__()三个特殊方法中的任意一个的类

 

1、__get__()访问属性,返回属性的值

__set__()在属性分配操作中调用,不返回任何内容

__delete__()控制删除,不返回任何内容

 

2、都会打印

 

3、

20

0

 

4、访问实例层次上的描述符,只会返回描述符本身,所以需要定义在类的层次上

 

0、

class Mydes:

    def __init__(self,value = None,name = None):

        self.val = value

        self.namae = name

 

    def __get__(self,instance,owner):

        print('正在获取变量',self.name)

        return self.val

 

    def __set__(self,instance,value):

        print('正在修改变量',self.name)

        self.val = value

 

    def __delete__(self,instance):

        print('正在删除变量',self.name)

        print('这个变量没法删除')

       

 

1、

import time as t

 

class Mydes:

    def __init__(self,value = None,name = None):

        self.val = value

        self.name = name

        self.filename = 'record.txt'

 

    def __get__(self,instance,owner):

        f = open(self.filename,'a',encoding = 'utf-8')

        f.write('%s变量于北京时间%s被读取,%s = %s \n' % (self.name,t.ctime(),self.name,str(self.val)))

        f.close()

        return self.val

 

    def __set__(self,instance,value):

        self.val = value

        f = open(self.filename,'a',encoding = 'utf-8')

        f.write('%s变量于北京时间%s被修改,%s = %s \n' % (self.name,t.ctime(),self.name,str(self.val)))

        f.close()

       

 

 

>>> class Test:

     x = Mydes(10,'x')

     y = Mydes(8.8,'y')

 

>>> test = Test()

>>> test.x

10

>>> test.y

8.8

>>> test.x=123

>>> test.x=1.23

>>> test.y='I love you'

>>>

2、

import os

import pickle

 

 

class Mydes:

    saved = []

 

    def __init__(self, name = None):

        self.name = name

        self.filename = self.name + '.pkl'

 

 

    def __get__(self,instance,owner):

        if self.name not in Mydes.saved:

            raise AttributeError('%s属性还没有赋值' % (self.name))

 

        with open(self.filename,'rb') as f:

            value = pickle.load(f)

 

        return value

 

    def __set__(self,instance,value):

        with open(self.filename,'wb') as f:

            pickle.dump(value,f)

            Mydes.saved.append(self.name)

 

    def __delete__(self,instance):

        os.remove(self.filename)

        Mydes.saved.remove(self.name)

 

>>> class Test:

     x = Mydes('x')

     y = Mydes('y')

 

    

>>> test = Test()

>>> test.x=123

>>> test.y='I love you'

>>> test.x

123

>>> test.y

'I love you'

>>> del test.x

 

class CountList(list):

    def __init__(self,*args):

        super().__init__(args)

        self.count = []

        for i in args:

            self.count.append(0)

 

    def __len__(self):

        return len(self.count)

    def __getitem__(self,key):

        self.count[key] += 1

        return super().__getitem__(key)

    def __setitem__(self,key,value):

        self.count[key] += 1

        return super().__setitem__(key,value)

    def __delitem__(self,key):

        del self.count[key]

        return super().__delitem__(key)

    def counter(self,key):

        return self.count[key]

    def append(self,value):

        self.count.append(0)

        super().append(value)

    def pop(self,key = -1):

        del self.count[key]

        return super().pop(key)

    def remove(self,value):

        key = super().index(value)

        del self.count[key]

        super().remove(value)

 

    def insert(self,key,value):

        self.count.insert(key,0)

        super().insert(key,value)

 

    def clear(self):

        self.count.clear()

        super().clear()

 

    def reverse(self):

        self.count.reverse()

        super().reverse()

 

 

运行结果

>>> a=CountList('x','y')

>>> a

['x', 'y']

>>> a[0] = 1

>>> a

[1, 'y']

>>> len(a)

2

>>> a.counter(0)

1

>>>

 

import datetime as t

class leapyear:

    def __init__(self):

        self.nt = t.date.today().year

 

    def isleapyear(self,year):

        if (year%4 == 0 and year%100 != 0) or (year%400 == 0):

            return True

        else:

            return False

 

    def __iter__(self):

        return self

 

    def __next__(self):

        while not self.isleapyear(self.nt):

            self.nt -= 1

 

        temp = self.nt

        self.nt -= 1#将年份提前一年便于下次判断

        return temp

 

 

运行结果

>>> a = leapyear()

>>> for i in a:

     if i >= 2000:

         print(i)

     else:

         break

 

    

2016

2012

2008

2004

2000

class Myrev:

    def __init__(self,data):

        self.data = data

        self.len1 = len(self.data)

 

    def __iter__(self):

        return self

    def __next__(self):

        if self.len1 == 0:

            raise StopIteration

        self.len1 -= 1

        temp = self.data[self.len1]

        return temp

 

运行结果

>>> a = Myrev('love')

>>> for i in a:

     print(i,end='')

 

    

evol

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值