Python-Classes
Allen_by
充满理想与追求,这一切似在指尖、心尖,都缠绕,都充盈,蓬勃待飞C语言、汇编语言、数据库系统、JAVA编程思想、C++程序设计、数据结构、计算机网络及算法与数据结构等专业知识擅长的计算机语言,以及计算机硬件的知识。数据库知识和经验,网络知识和技能
展开
-
Python-类
类提供了将数据和功能捆绑在一起的方法。创建新类会创建一种新类型的对象,从而允许创建该类型的新实例。每个类实例都可以附加属性以维护其状态。类实例还可以具有用于修改其状态的方法(由其类定义)。与其他编程语言相比,Python的类机制添加了具有最少新语法和语义的类。它是C ++和Modula-3中的类机制的混合体。Python类提供面向对象编程的所有标准功能:类继承机制允许多个基类,派生类可以覆盖其基...原创 2018-12-29 14:01:53 · 291 阅读 · 0 评论 -
Python类创建一个自定义数据类型
创建一个新的拥有一些额外功能的实例属性类型,比如类型检查。# Descriptor attribute for an integer type-checked attributeclass String(object): def __init__(self, name): self.name = name def __get__(self, instance,...原创 2019-01-01 15:36:29 · 18888 阅读 · 0 评论 -
Python类使用延迟计算属性
你想将一个只读属性定义成一个property,并且只在访问的时候才会计算结果。 但是一旦被访问后,你希望结果值被缓存起来,不用每次都去计算。定义一个延迟属性的一种高效方法是通过使用一个描述器类。class Delayproperty: def __init__(self, func): self.func = func def __get__(self, in...原创 2019-01-01 15:58:22 · 546 阅读 · 0 评论 -
Python类-简化模版
有时候写了很多仅仅用作数据结构的类,不想写太多烦人的_init_() 函数,可以在父类写一个公共的init方法。import mathclass Structure1: # Class variable that specifies expected fields _fields = [] def __init__(self, *args): if ...原创 2019-01-01 16:22:21 · 797 阅读 · 0 评论 -
不用递归实现访问者模式
使用访问者模式遍历一个很深的嵌套树形数据结构,可能会因为超过嵌套层级限制而失败。 可以使用生成器可以在树遍历或搜索算法中消除递归。import typesclass Node(object): passclass NodeVisitor(object): def visit(self, node): stack = [node] las...原创 2019-01-11 18:00:29 · 211 阅读 · 1 评论 -
循环引用数据结构-使用弱引用
import weakrefclass Node: def __init__(self, value): self.value = value self._parent = None self.children = [] def __repr__(self): return 'Node({!r:})'.forma...原创 2019-01-11 23:39:45 · 252 阅读 · 0 评论 -
使用Python类 - 定义接口或者抽象基类
想定义一个接口或抽象类,并且通过执行类型检查来确保子类实现了某些特定的方法,可以使用 abc 模块可以很轻松的定义抽象基类。from abc import ABCMeta, abstractmethodclass IStream(metaclass=ABCMeta): @abstractmethod def read(self, maxbytes=-1): ...原创 2019-01-02 09:55:43 · 763 阅读 · 0 评论 -
创建类的缓存实例
在创建一个类的对象时,如果之前使用同样参数创建过这个对象, 这时候不想在创建,而使用之前的实例缓存。你希望相同参数创建的对象是单例的。可以使用 logging 模块,使用相同的名称创建的 logger 实例永远只有一个。例1:import loggingone = logging.getLogger('foo')two = logging.getLogger('bar')one is ...原创 2019-01-11 23:39:23 · 343 阅读 · 0 评论 -
类支持比较操作
让某个类的实例支持标准的比较运算(比如>=,!=,<=,<等),但是又不想去实现那一大丢的特殊方法。Python类对每个比较操作都需要实现一个特殊方法来支持。 例如为了支持>=操作符,你需要定义一个 、_ge_() 方法。 尽管定义一个方法没什么问题。装饰器 functools.total_ordering 就是用来简化这个处理的。 使用它来装饰一个来,你只需定义一个 ...原创 2019-01-11 23:40:16 · 168 阅读 · 0 评论 -
Python类中实现多个构造器
实现多个构造器,可以使用类方法import timeclass Date: """方法一:使用类方法""" # Primary constructor def __init__(self, year, month, day): self.year = year self.month = month self.day = ...原创 2019-01-08 13:34:41 · 5233 阅读 · 0 评论 -
创建不需要调用__init__类实例
可以通过 _new_() 方法创建一个未初始化的实例。class Date(object): def __init__(self, year, month, day): self.year = year self.month = month self.day = dayif __name__ == "__main__": d ...原创 2019-01-08 13:43:24 · 552 阅读 · 0 评论 -
使用Mixins扩展类功能
可以有很多的方法,来扩展其他类的功能。如果这些类并没有任何继承的关系。 因此你不能简单的将这些方法放入一个基类,然后被其他类继承。通常当你想自定义类的时候会碰上这些问题。可能是某个库提供了一些基础类, 你可以利用它们来构造你自己的类。可以使用扩展映射对象,给它们添加日志、唯一性设置、类型检查等等功能。from collections import defaultdict...原创 2019-01-09 13:39:10 · 333 阅读 · 0 评论 -
Python子类中扩展父类property
在子类中,你想要扩展定义在父类中的property的功能。class Person: def __init__(self, name): self.name = name # Getter function @property def name(self): return self._name # Setter func...原创 2019-01-01 15:13:50 · 801 阅读 · 0 评论 -
Python调用父类方法-super
在子类中调用父类的某个已经被覆盖的方法,需要使用 super() 函数。class Parent(object): def spam(self): print('Parent.spam')class Child(Parent): def spam(self): print('Child.spam') super().s...原创 2019-01-01 14:51:23 · 7148 阅读 · 0 评论 -
重写str跟repr方法 - 改变对象的字符串显示
改变一个实例的字符串表示,可重新定义它的 str() 和 repr() 方法。class Structure_p(object): def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return 'Pair({0.x!r}, {0.y!r})'....原创 2018-12-31 17:48:30 · 551 阅读 · 0 评论 -
重新构造format方法,自定义输出
重新构造__format__方法,来实现自定输出打印。import datetimeclass Format_Date(object): _formats = { 'YMD': '{d.year}-{d.month}-{d.day}', 'MDY': '{d.month}/{d.day}/{d.year}', 'DMY': '{...原创 2018-12-31 18:23:53 · 303 阅读 · 0 评论 -
利用__enter__跟__exit__方法,实现上下文管理协议
构造请求类支持上下文管理协议import requestsclass Request_With(object): def __enter__(self): print(1) self.keep_request = requests.Session() return self.keep_request def __exit_...原创 2018-12-31 19:02:22 · 256 阅读 · 0 评论 -
优化创建类时所占用的内存
有时候程序可能要创建大量(比如:同时有上万个网络请求调用)的对象,导致占用很大的内存。对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加 slots 属性来极大的减少实例所占的内存。class Reuqest: __slots__ = ['url', 'keyword'] def __init__(self, url, keyword): self...原创 2018-12-31 19:26:12 · 197 阅读 · 0 评论 -
Python-实现数据模型的类型约束
定义某些在属性赋值上面有限制的数据结构,对赋值时进行各种检查,这种情况最好的方法就是使用描述器。# Base class. Uses a descriptor to set a valueclass Descriptor: def __init__(self, name=None, **opts): self.name = name for key, v...原创 2019-01-05 13:27:08 · 1916 阅读 · 2 评论 -
在类中实现私有数据
想封装类的实例上面的“私有”数据,但是Python语言并没有访问控制。Python本身不去依赖语言特性去封装数据,而是通过遵循一定的属性和方法命名规约来达到这个效果。 第一个约定是任何以单下划线_开头的名字都应该是内部实现。Python并不会真的阻止别人访问内部名称。但是如果你这么做肯定是不好的,可能会导致脆弱的代码。 同时还要注意到,使用下划线开头的约定同样适用于模块名和模块级别函数。 例如...原创 2018-12-31 23:57:01 · 309 阅读 · 0 评论 -
Python类中自定义属性验证-创建可管理的属性
给某个实例attribute增加除访问与修改之外的其他处理逻辑,比如类型检查或合法性验证。自定义某个属性的一种简单方法是将它定义为一个property。class Name_Check(object): def __init__(self, first_name, last_name): self.first_name = first_name s...原创 2019-01-01 00:55:18 · 608 阅读 · 0 评论 -
Python类-自定义容器
实现一个自定义的类来模拟内置的容器类功能,比如列表和字典。可以使用collections模块,定义了很多抽象基类,当你想自定义容器类的时候它们会非常有用。import collectionsimport bisectclass Sorted_Items(collections.Sequence): def __init__(self, initial=None): ...原创 2019-01-05 16:14:38 · 990 阅读 · 0 评论 -
Python类实现代理访问
加入想将某个实例的属性访问代理到内部另一个实例中去,目的可能是作为继承的一个替代方法或者实现代理模式,简单来说,代理是一种编程模式,它将某个操作转移给另外一个对象来实现。class A(object): def spam(self, x): print(x) pass def foo(self): passclass B(o...原创 2019-01-05 16:43:31 · 1686 阅读 · 0 评论 -
通过字符串调用对象方法
使用 getattr() 函数。class Person(object): def __init__(self, name, age): self.name = name self.age = age def info(self): return {"name", self.name, "age",...原创 2019-01-10 22:09:19 · 903 阅读 · 0 评论 -
多种不同方法实现访问者模式
例1:class Node: passclass UnaryOperator(Node): def __init__(self, operand): self.operand = operandclass BinaryOperator(Node): def __init__(self, left, right): self.left...原创 2019-01-10 22:09:47 · 178 阅读 · 0 评论 -
实现事物状态对象或者状态机制
想实现一个状态机制或者是在不同状态下执行操作的对象,但是又不想在代码中出现太多的条件判断语句。class Connection(object): """新方案——对每个状态定义一个类""" def __init__(self): self.new_state(ClosedConnectionState) def new_state(self, news...原创 2019-01-09 13:48:15 · 276 阅读 · 0 评论