python 24 描述符控制参数类型以及上下文管理协议

# python 上下文管理协议 描述符
# /usr/sbin/py/python
# -*-coding:utf8-*-

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

    def __enter__(self):
        print("execute enter")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("execute exit")


with Open("a.txt") as f: # 指 with as 这种写法
    print("---------")
    print(f.name)
    pass
# 自动触发类中的 enter方法,方法结束后会触发exit方法
# with 代码块如果出现异常 会直接执行exit方法
# 描述符
# 数据描述符:至少实现了 get,set方法
# 非数据描述符:没有set方法
# 优先级 类属性》数据描述符》实例属性》非数据描述符》找不到的属性除非__getattr__()方法
# 通过属性描述符来限制变量类型
# 声明一个数据描述符
class StrType:
    def __init__(self,key,paramType):
        self.key = key
        self.paramType = paramType


    def __get__(self, instance, owner):
        print("get",instance,owner)
        return instance.__dict__[self.key]



    def __set__(self, instance, value):
        if isinstance(value,self.paramType):
            instance.__dict__[self.key] = value
        else:
           # print("传入数据类型错误不是字符串",value)
           raise TypeError("传入数据类型错误不是字符串",value)
          #  return




    def __delete__(self, instance):
        instance.__dict__.pop(self.key)


class Person:
    name = StrType("name",str)
    age = StrType("age",int)
    salary = StrType("salary",float)
    def __init__(self,name,age,salary):
        self.name = name
        self.age =age
        self.salary =salary

p1 = Person("jake",10,33.5)
print("=================>",p1.__dict__)
print(p1.name)
# p2 = Person(1,2,3)
# print(p2.__dict__)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值