当前位置: 首页 > news >正文

阿里云服务器上传网站内容潍坊网站制作在线

阿里云服务器上传网站内容,潍坊网站制作在线,布吉网站建设哪家技术好,专业婚纱摄影网站制作文章目录1. 使用动态属性转换数据2. property2.1 help() 文档3. 特性工厂函数4. 属性删除操作5. 处理属性的重要属性和函数5.1 处理属性的内置函数5.2 处理属性的特殊方法learn from 《流畅的python》 1. 使用动态属性转换数据 在 Python 中#xff0c;数据的属性和处理数据… 文章目录1. 使用动态属性转换数据2. property2.1 help() 文档3. 特性工厂函数4. 属性删除操作5. 处理属性的重要属性和函数5.1 处理属性的内置函数5.2 处理属性的特殊方法learn from 《流畅的python》 1. 使用动态属性转换数据 在 Python 中数据的属性和处理数据的方法统称属性attribute。其实方法只是可调用的属性我们还可以创建特性 property from urllib.request import urlopen import warnings import os import jsonURL http://www.oreilly.com/pub/sc/osconfeed JSON ./osconfeed.jsondef load():if not os.path.exists(JSON):msg downloading {} to {}.format(URL, JSON)warnings.warn(msg) # 发出提醒with urlopen(URL) as remote, open(JSON, wb) as local:# 使用两个上下文管理器local.write(remote.read())# 读取和保存远程文件with open(JSON) as fp:return json.load(fp)feed load() print(feed) print(sorted(feed[Schedule].keys())) for key, value in sorted(feed[Schedule].items()):print({:3} {}.format(len(value), key)) print(feed[Schedule][speakers][-1][serial]) # 这种句法太长了。。。如何改进from collections import abcclass FrozenJSON:# 一个只读接口使用属性表示法访问JSON类对象def __init__(self, mapping):self.__data dict(mapping)def __getattr__(self, name):if hasattr(self.__data, name): # 有属性获取return getattr(self.__data, name)# 调用 keys 等方法就是通过这种方式处理的else: # 没有构建 FrozenJSONreturn FrozenJSON.build(self.__data[name])classmethod # 备选构造方法classmethod 装饰器经常这么用def build(cls, obj):if isinstance(obj, abc.Mapping):return cls(obj) # 构建 FrozenJSONelif isinstance(obj, abc.MutableSequence):# 是序列对每个元素都进行 buildreturn [cls.build(item) for item in obj]else:return objraw_feed load() feed FrozenJSON(raw_feed) print(len(feed.Schedule.speakers)) print(sorted(feed.Schedule.keys())) # [conferences, events, speakers, venues] print(feed.Schedule.events[-1].name) # Why Schools Dont Use Open Source to Teach Programming p feed.Schedule.events[-1] print(type(p)) # class __main__.FrozenJSON print(p.name) # Why Schools Dont Use Open Source to Teach Programming print(p.speakers) # [157509] print(p.age) # KeyError: age处理无效属性名 例如内置的关键字 keyword.iskeyword grad FrozenJSON({name: Jim Bo, class: 1982}) # print(grad.class) # invalid syntax print(getattr(grad, class)) # 1982修改类的构造函数 def __init__(self, mapping):self.__data {}for k,v in mapping.items():if keyword.iskeyword(k): # 如果是关键字则增加下划线后缀k _self.__data[k] v无效的命名str.isidentifier() grad FrozenJSON({2name: Jim Bo, class: 1982}) print(grad.2name) # SyntaxError: invalid syntax改名 def __init__(self, mapping):self.__data {}for k,v in mapping.items():if keyword.iskeyword(k):k _if not k.isidentifier(): # 不是合法的命名改之k _ kself.__data[k] vprint(grad._2name) # Jim Bo__init__ 方法其实是 “初始化方法”。真正的构造方法是 __new__但是几乎不需要自己编写 # 构建对象的伪代码 def object_maker(the_class, some_arg): new_object the_class.__new__(some_arg) # new 方法也可以返回其它类对象if isinstance(new_object, the_class): the_class.__init__(new_object, some_arg) return new_objectclass FrozenJSON:# 一个只读接口使用属性表示法访问JSON类对象def __new__(cls, arg): # 第一个参数是类本身if isinstance(arg, abc.Mapping):return super().__new__(cls)elif isinstance(arg, abc.MutableSequence):return [cls(item) for item in arg]else:return argdef __init__(self, mapping):self.__data {}for k, v in mapping.items():if keyword.iskeyword(k):k _if not k.isidentifier():k _ kself.__data[k] vdef __getattr__(self, name):if hasattr(self.__data, name): # 有属性获取return getattr(self.__data, name)# 调用 keys 等方法就是通过这种方式处理的else: # 没有构建 FrozenJSONreturn FrozenJSON(self.__data[name])2. property https://www.liaoxuefeng.com/wiki/1016959663602400/1017502538658208 请利用 property 给一个Screen对象加上width和height属性以及一个只读属性resolution class Screen(object):def __init__(self):self._w 0self._h 0self._r 786432property # 将方法变成属性, 调用不要加()def width(self):return self._wpropertydef height(self):return self._hwidth.setter # 可以设置属性值没有该方法是只读属性def width(self, v):self._w vheight.setterdef height(self, v):self._h vpropertydef resolution(self):return self._rs Screen() s.width 1024 s.height 768 print(resolution , s.resolution) if s.resolution 786432:print(测试通过!) else:print(测试失败!)特性都是类属性但是特性管理的其实是实例属性的存取 class Class:data class data attrpropertydef prop(self):return prop valueobj Class() print(vars(obj)) # {}, vars 函数返回 obj 的 __dict__ 属性 print(obj.data) # class data attr obj.data changed print(vars(obj)) # {data: changed} print(Class.data) # class data attr # 实例修改了data但是 类属性没有被修改print(Class.prop) # property object at 0x0000021A91E4A680 print(obj.prop) # prop value # obj.prop changed prop # 报错 cant set attribute obj.__dict__[prop] changed prop1 print(vars(obj)) # {data: changed, prop: changed prop1} print(obj.prop) # prop value # # 读取 obj.prop 时仍会运行特性的读值方法。特性没被实例属性遮盖 Class.prop haha # 覆盖 Class.prop 特性销毁特性对象 print(obj.prop) # changed prop1 # 现在obj.prop 获取的是实例属性。 # Class.prop 不是特性了因此不会再覆盖 obj.prop。print(obj.data) # changed print(Class.data) # class data attr Class.data property(lambda self : data prop value) # 使用新特性覆盖 Class.data print(obj.data) # data prop value # obj.data 被 Class.data 特性遮盖了 del Class.data # 删除特性 print(obj.data) # changed # 恢复原样obj.data 获取的是实例属性 dataobj.attr 这样的表达式不会从 obj 开始寻找 attr而是从 obj.__class__ 开始而且仅当类中没有名为 attr 的特性时Python 才会在 obj 实例中寻找。 这条规则不仅适用于特性 还适用于一整类描述符——覆盖型描述符overriding descriptor 2.1 help() 文档 使用装饰器创建 property 对象时读值方法有 property 装饰器 的方法的文档字符串作为一个整体变成特性的文档 class Foo:propertydef bar(self):说明文档return self.__dict__[bar]bar.setterdef bar(self, val):self.__dict__[bar] val help(Foo) Help on class Foo in module __main__:class Foo(builtins.object)| Data descriptors defined here:| | __dict__| dictionary for instance variables (if defined)| | __weakref__| list of weak references to the object (if defined)| | bar| 说明文档 help(Foo.bar) Help on property:说明文档 经典写法传入 doc 参数 weight property(get_weight, set_weight, docweight in kilograms)3. 特性工厂函数 为了减少编写 gettersetter可以使用特性工厂函数 def quantity(storage_name):def qty_getter(instance):return instance.__dict__[storage_name]def qty_setter(instance, value):if value 0:instance.__dict__[storage_name] valueelse:raise ValueError(value must be 0)return property(qty_getter, qty_setter)class LineItem:weight quantity(weight) # 使用特性工厂函数定义weight类属性price quantity(price) # price 属性def __init__(self, description, weight, price):self.description descriptionself.weight weight # 激活属性确保不为负数和0self.price pricedef subtotal(self):return self.weight * self.price # 使用特性中存储的值line1 LineItem(name1, 8, 13.5) print(line1.weight, line1.price) # 8 13.5 print(sorted(vars(line1).items())) # [(description, name1), (price, 13.5), (weight, 8)]weight 特性 覆盖了 weight 实例属性因此对 self.weight 或 obj.weight 的 每个引用都由特性函数处理只有直接存取 __dict__ 属性才能跳过特性的处理逻辑 4. 属性删除操作 del 操作删除属性很少见但是 python 支持该操作 class BlackKnight:def __init__(self):self.members [an arm,another arm,a leg,another leg]self.phrases [Tis but a scratch.,Its just a flesh wound.,Im invincible!,All right, well call it a draw.]propertydef member(self):print(next member is:)return self.members[0]member.deleterdef member(self):text BLACK KNIGHT (loses {})\n-- {}print(text.format(self.members.pop(0), self.phrases.pop(0)))knight BlackKnight() print(knight.member) # next member is: # an arm del knight.member # BLACK KNIGHT (loses an arm) # -- Tis but a scratch. del knight.member # BLACK KNIGHT (loses another arm) # -- Its just a flesh wound. del knight.member # BLACK KNIGHT (loses a leg) # -- Im invincible! del knight.member # BLACK KNIGHT (loses another leg) # -- All right, well call it a draw. del knight.member # IndexError: pop from empty list经典写法fdel 参数设置删除函数 member property(member_getter, fdelmember_deleter)如果不使用特性还可以实现低层特殊的 __delattr__ 方法处理 删除属性 的操作 5. 处理属性的重要属性和函数 __class__ 对象所属类的引用即 obj.__class__ 与 type(obj) 的作用相 同 Python 的某些特殊方法例如 __getattr__只在对象的类中寻找而不在实例中寻找__dict__ 一个映射存储对象或类的可写属性。 有 __dict__ 属性的对象 任何时候都能随意设置新属性 如果类有 __slots__ 属性它的实例可能没有 __dict__ 属性__slots__ 类可以定义这个这属性限制实例能有哪些属性 __slots__ 属性 的值是一个字符串组成的元组指明允许有的属性 如果 __slots__ 中没有 __dict__那么该类的实例没有 __dict__ 属性实例只允许有指定名称的属性 5.1 处理属性的内置函数 dir([object]) 列出对象的大多数属性dir 函数也不会列出类的几个特殊属性例如 __mro__、__bases__ 和 __name__ dir(Foo) [__class__, __delattr__, __dict__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __init__,__init_subclass__, __le__, __lt__, __module__,__ne__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__, __weakref__, bar]getattr(object, name[, default]) 从 object 对象中获取 name 字符串对应的属性 获取的属性可能来自 对象所属的类或超类 如果没有指定的属性getattr 函数抛出 AttributeError 异常或者返回 default 参数的值如果设定了这个参数的话hasattr(object, name)调用上面的函数看是否返回异样setattr(object, name, value)可能会创建一个新属性或者 覆盖现有的属性vars([object])返回 object 对象的 __dict__ 属性 如果实例所属的类定义了 __slots__ 属性实例没有 __dict__ 属性那么 vars 函数不能处理 那个实例 5.2 处理属性的特殊方法 使用点号或内置的 getattr、hasattr 和 setattr 函数存取属性都会 触发下述列表中相应的特殊方法 但是直接通过实例的 __dict__ 属性读写属性不会触发这些特殊方法通常会使用这种方式 跳过特殊方法 特殊方法不会被同名实例属性 遮盖
http://www.pierceye.com/news/353352/

相关文章:

  • 免费海外网站建设自学设计软件的免费网站
  • 个人姓名最多备案多少个网站外贸网站制作公司
  • 上海市建设安全协会官方网站上海人才网官网公示
  • 原创文章网站wordpress注册页面修改密码
  • 山东省建设注册执业中心网站博物馆网站做的最好的
  • 做论坛网站能赚钱吗山东济南网站建设公司
  • 建网站海外英文建站
  • 学网站开发网页制作苏州模板建站哪家好
  • 音乐网站建设怎么上传音乐易点租电脑租赁官网
  • 做足球网站前景一个网站源码值多少钱
  • 成都网站排名优化公司上海创意网站建设
  • 贵阳市住房城乡建设局八大员网站wordpress 输出 文章时间
  • 那个装修公司的网站做的好想创业去哪里找项目
  • 公选课网页制作与网站建设网页游戏平台十大排名
  • 无锡锡牛网站建设网站倒计时
  • 南通做外贸网站网站建设培训四川
  • 微小店适合卖做分类网站吗手机开发者网站
  • 广州建企业网站网页设计是啥意思
  • wap手机网站建设刀模 东莞网站建设
  • 怎样做网站的外链做推广优化的网站有哪些内容
  • 永嘉规划建设局网站备案个人网站做淘宝客
  • 枣庄网站建设电话网站怎么做 凡科
  • 视频网站点击链接怎么做的宁波网站建设接单
  • 网站报价表怎么做wordpress 横向扩展
  • 溧阳网站建设哪家好网站建设的教程
  • 360怎么做网站做pop网站
  • 网站建设方案书2000字中国正国级名单
  • 企业网站的布局类型网站移动页面怎么做的
  • 人是用什么做的视频网站吗wordpress如何设水印图片
  • 蛋糕店的网站建设咋写深圳市宝安区邮政编码