Python是一门高级语言,支持面向对象设计,如何设计一个符合Python风格的面向对象的类,是一个比较复杂的问题,本文提供一个参考,表达一种思路,探究一层原理。...@classmethod的用法是:定义操作类,而不是操作实例的方法。常用来定义备选构造方法。 @staticmethod其实就是个普通函数,只不过刚好放在了类的定义体里。...但是更符合Python风格的做法是定义子类: class ShortVector2d(Vector2d): typecode = 'f' Django基于类的视图大量使用了这个技术。...小结 本文先介绍了如何实现特殊方法来设计一个Python风格的类,然后分别实现了格式化显示与可散列对象,使用__slots__能为类节省内存,最后讨论了类属性覆盖技术,子类覆盖是Django基于类的视图大量用到的技术...参考资料: 《流畅的Python》第9章 符合Python风格的对象 https://www.jianshu.com/p/7fc0a177fd1f
但是,他也提到,他并不知道学习哪种语言,可以加深对 Python 元类设计的理解。 这其实意味着,Python 的元类设计有着很大的原创性,并非借鉴自哪种语言的成熟设计!...既然不是从其它语言中学习来的,那么,Python 的元类思想到底起源自哪里呢?Guido 不会是“无中生有”开创出来的设计吧?...python-ideas 上有人猜测 Python 的元类设计是起源自 Ruby。事实并非如此。既然是关于语言特性的起源,我觉得我有必要来澄清下事实。...但即便是在 Python 最初的设计中(1990 年,发布于 1991 年),类型(type)本身就是一个对象。...当时我对 Smalltalk 只有模糊的了解;当我后来读到它的元类设计时,我感到很惊讶,因为它与 Python 或 Ruby 中的元类有很大的不同!
本文将在上篇文章二维向量Vector2d类的基础上,定义表示多维向量的Vector类。...超过6个的元素用...来表示。 第2版:支持切片 Python协议是非正式的接口,只在文档中定义,在代码中不定义。...比如Python的序列协议只需要__len__和__getitem__两个方法,Python的迭代协议只需要__getitem__一个方法,它们不是正式的接口,只是Python程序员默认的约定。...小结 经过上下两篇文章的介绍,我们知道了Python风格的类是什么样子的,跟常规的面向对象设计不同的是,Python的类通过魔法方法实现了Python协议,使Python类在使用时能够享受到语法糖,不用通过...参考资料: 《流畅的Python》第10章 序列的修改、散列和切片
如何使用类来对有用的对象进行建模? 一、Python和OOP Python和OOP实现可以概括为三个概念。...从设计师的角度看,继承是一种定义集合成员关系的方式:类定义了一组内容属性,可由更具体的集合(子类)继承和定制。 子类和超类的继承是1对1的关系....在Python中,委托通常是以__getattr__钩子方法实现的,因为这个方法会拦截对不存在属性的读取,包装类(代理类)可以使用__getattr__把任意读取转发给包装的对象。...当这么做时,就在使用所谓的多重继承:类和其实例继承了列出的所有超类的变量。搜索属性时,Python会由左到右搜索类首行中的超类,直到找到相符者。...这类函数在OOP设计领域偶尔称为工厂。 工厂式的函数或程序代码,在一些情况下很方便,因为他们可以让我们取出并传入没有预先在程序代码中硬编码的类。实际上,这些类在编写程序时可能还不存在。抽象类。
/usr/bin/env python #-*-encoding:utf-8-*- __author__ = 'shouke' import os class MyTestClass:...说明: 如上,get_files_in_dirpath函数目的是为了获取指定目录下的文件,按常理是函数中定义个变量,存放结果,最后直接return这个变量就可以了,但是因为涉及子目录的遍历,函数中通过...个人觉得比较不合理的方式就是按上面的,“强行”在类中定义个类属性来存放这个结果,然后再定义个函数,返回这个结果,感觉这样设计不太好,还会增加代码逻辑的模糊度。 那咋办?...个人觉得比较合理的解决方案,可以使用嵌套函数。如下: 代码2 #!.../usr/bin/env python #-*-encoding:utf-8-*- __author__ = 'shouke' import os class MyTestClass:
引言 在 web 项目中,我们经常使用自定义状态码来告知请求方请求结果以及请求状态;在 Python 中该如何设计自定义的状态码信息呢? 普通类加字典设计状态码 #!...,再使用过程中也没那么方便,简单试下组织一个成功的信息 data = { 'code': RETCODE.OK, 'errmsg': err_msg[RETCODE.OK] } 巧用枚举类设计状态码信息...利用枚举类就可以巧妙的设计状态码信息 枚举类的定义 #!...= (-1, '错误') SERVER_ERR = (500, '服务器异常') 普通的类继承 enum 模块中的 Enum 类就变成了枚举类。...,由于 枚举类.属性名 对应着不同的枚举对象就很好的把状态码和信息进行了封装。
---- 三、类的设计 都知道面向对象开发出来的程序最终结果是不同的对象调用不同的方法。在面向对象中想要创建出对象,得先有类,那类是怎么样设计出来的?下面开始慢慢说明。...在程序开发中,要设计一个类,通常需要满足以下三个要素: 1. 类名:这类事物的名字,满足大驼峰命名法 2. 属性:这类事物具有什么样的特征 3....提示:需求中没有涉及的属性或者方法在设计类时,不需要考虑 ---- 练习1: 需求: 小明今年20岁,身高180cm,每天早上跑完步,会去吃东西 小菜今年18岁,身高165cm,小菜不跑步,小菜喜欢吃东西...解答:设计一个人类,属性包含名字、年龄、身高,行为包含跑和吃,再创建两个不同的对象。...---- 练习2: 需求: 一只黄色的狗狗叫大黄 见到生人 汪汪叫 见到家人 摇尾巴 解答:设计一个狗的类,属性是名字和厌恶,行为是汪汪叫和摇尾巴。
大家好,又见面了,我是全栈君 使用执行速度缓存的程序可以大大提高程序,设计一个简单的缓存类并不需要太复杂的逻辑. 只需要一个简单的3接口....存款对象 以一个对象 删除对象 阅读对象 读取对象的时候先读内存 内存没有就读文件 保存对象 保存对象的时候前台保存到内存里 后台存入到文件中 内存空间不足就须要先释把记忆 时间收到内存邮件删除不够放所有的记忆
其基础是内聚,表示类完成单一功能的程度。 开放—封闭原则(Open Closed Principle,OCP):类应该对扩展开放,对修改关闭。是SOLID原则中最重要的一个。...发布接口 接口要更接近使用它们的类, 发布接口是由导出包中公开类的公开方法组成的,它可以被其他的模块调用。 使用标准的JAVA,阻止外部类访问你不想公开的类或方法的最简单方式就是使用接口。...抽象化模块 通过在新的模块中,定义新的类来实现或扩展抽象体,能够更容易地扩展和维护应用。只依赖模块的抽象元素会付出一定的代价:创建实现类的实例时不能再使用new关键字了。...如下场景下会更好:第一种,在Web应用程序中,如果想在服务器启动的时候创建一些特定的类,可以使用Class类并且在启动属性文件中指定要实例化的具体类,通过指定新的类并将其全限定名设置在适当的属性文件中,...如果依赖抽象体的所有类位于多个模块中,那么将抽象体放在一个单独的模块中,这个模块与依赖抽象体的类实现了分离。包含实现的模块要依赖包含抽象体的模块。
设计线程安全的类: 在设计线程安全类的过程中,需要包含以下三个基本要素: 找出构成对象状态的所有变量; 找出约束状态变量的不变性条件; 建立对象状态的并发访问管理策略。...当从头开始构建一个类或者将多个非线程安全的类组合成一个类时,监视器模式非常有用。但如果类中各个组件已经是线程安全的,会是什么情况?...在某些情况下通过多个线程安全类组合而成的类是线程安全的,而在某些情况下不是。 如果某个类含有复合操作,那么仅靠委托并不足以实现线程安全性。...如果一个类是由多个独立且线程安全的状态变量组成,并且在所有的操作中都不包含无效的状态转换,那么可以将线程安全性委托给低层的状态变量。...发布低层的状态变量: 当把线程安全性委托给某个对象的底层状态变量时,什么条件下可以发布这些变量从而使其他类可以修改它们?答案仍然取决于在类中对这些变量施加了什么不变性条件。
设计模式在程序设计上有着很重要的作用,使用设计模式可以使得代码更容易被理解,使得代码更规范,真正实现工程化。...一、用UML表示一个类 类图一般是三行的结构: 类名称 属性:格式(可见性 名称:类型[=缺省值]) 方法:格式(可见性 名称(参数列表)[返回类型]) 注:在Visio中的画的类图中使用的是C#的数据类型...二、类与类之间的关系 类与类之间主要有6种关系,包括依赖,关联,聚合,组合,继承,实现。他们的耦合度是一次增强的。...依赖关系主要有3种表现形式:(以类A中使用了类B为例) 类B是作为类A的方法参数 类B是类A的方法中的局部变量 在类A中调用类B的静态方法 在依赖中使用的是“虚线+箭头”。...设计模式中类的关系(http://blog.csdn.net/zhengzhb/article/details/7187278)
设计模式在程序设计上有着很重要的作用,使用设计模式可以使得代码更容易被理解,使得代码更规范,真正实现工程化。 一、用UML表示一个类 ?...类图一般是三行的结构: 类名称 属性:格式(可见性 名称:类型[=缺省值]) 方法:格式(可见性 名称(参数列表)[返回类型]) 注:在Visio中的画的类图中使用的是C#的数据类型,与Java的略有差别...二、类与类之间的关系 类与类之间主要有6种关系,包括依赖,关联,聚合,组合,继承,实现。他们的耦合度是一次增强的。...依赖关系主要有3种表现形式:(以类A中使用了类B为例) 类B是作为类A的方法参数 类B是类A的方法中的局部变量 在类A中调用类B的静态方法 ? 在依赖中使用的是“虚线+箭头”。...设计模式中类的关系(http://blog.csdn.net/zhengzhb/article/details/7187278)
设计不能被拷贝的类 c++11是下边的用法,c++98就是将拷贝构造变成私有,并且只声明并不实现 class A { public: A(int val):_val(val){} A(const A...& a) = delete; A& operator=(const A& a) = delete; private: int _val; }; 设计只能在堆上创建的类 方案1、将析构函数私有化...{} }; int main() { HeapOnly* hp = HeapOnly::CreatObj(); delete hp; return 0; } 注意:也要把拷贝构造给删除掉 设计只能在栈上创建的类...设计不能被继承的类 // C++98中构造函数私有化,派生类中调不到基类的构造函数。...class A final { // .... }; 设计只能创建一个对象的类(单例) 饿汉模式 构造函数私有,在静态区创建一个对象, 简单,没有线程安全问题 一个程序中,多个单例,并且有先后创建初始化的顺序要求时
请设计一个类,只能在堆上创建对象 实现方式: 1. 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。 2....请设计一个类,只能在栈上创建对象 方法: 同上将构造函数私有化,然后设计静态方法创建对象返回即可。...请设计一个类,不能被继承 C++98方式 // C++98中构造函数私有化,派生类中调不到基类的构造函数。...请设计一个类,只能创建一个对象(单例模式) 设计模式: 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的 总结。为什么会产生设计模式这样的东西呢?...使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模 式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
类理论强烈建议父类和子类使用相同的方法名来表示特定的行为,从而让子类重写父类。我们之后会看到,在JavaScript代码中这样做会降低代码的可读性和健壮性。 类设计模式 “类”是设计模式?...你可能从来没把类作为设计模式来看待,很多人对设计模式的印象恐怕是迭代器模式、观察者模式、工厂模式、单例模式等等。...并不是所有语言都是有类这个概念的,比如JavaScript在es6之前就没有class) 我们熟知的优秀设计模式,看起来是在(低级) 面向对象类的基础上实现了所有(高级)设计模式,似乎面向对象是优秀代码的基础...为了满足对于类设计模式的最普遍需求,JavaScript提供了一些近似类的语法 虽然有近似类的语法,但是JavaScript的机制似乎一直在阻止你使用类设计模式。...通常来说,尽量避免使用这样的结构,以保证代码的整洁和可维护性。 小结 类是一种设计模式。许多语言提供了对于面向类软件设计的原生语法。
但应该尽可能的保证封装的特性。 类应该尽可能的「小」 在函数的那一章我们提到过方法应该设计的尽可能的小,我们衡量函数使用代码行数,在这里我们衡量类使用「职责」。...诚然,当我们修改了获取lastFocus组件的方法时,往往是要修改版本号的,但是反过来就不一定了。 SRP是OOP中最重要的设计理念之一,但同时也是最常被违反的理念之一。...一个类中的所有方法都操作了这个类中的所有实例变量,那么这个类就是聚合型最高的。 但是,通常来说这样的超级内聚的类不太可能出现,也不建议去建立这样的类。...所以,一旦你的类的内聚性降低时,就去着手把它拆分为更小的类吧。 所以,拆分类可以从拆分超级方法开始,这样往往能给我们带来一个更清晰的类的组织结构。 为了变化而设计 对于大多数的系统,变化是持续发生的。...每次发生改变,都可能对我们的现有系统造成威胁,那么我们设计系统中「类的组织结构」时就要尽可能降低这种风险。 然后在这个小节作者举了个使用abstract类来解决对类的修改的问题。
特殊类的设计 一、设计一个不能被拷贝的类 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。...: int main() { HeapOnly* hp = HeapOnly::CreateObj(); return 0; } 三、设计一个只能在栈上创建对象的类...首先我们先了解一下设计模式。 设计模式:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。...使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。...,static 的类成员不算该类的成员,静态成员变量属于所有类的对象,属于整个类,即属于整个 Singleton 类。
一、特殊类的设计 1、不能被拷贝的类 一个类不能被拷贝的需求还是比较常见的,比如IO流、线程等。...4、不能被继承的类 C++98的方式是把构造函数私有化,因为派生类必须调用基类的构造函数来初始化基类的部分,派生类中调不到基类的构造函数,就无法继承。...5、只能创建一个对象的类(单例模式) | 设计模式: 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。...这些解决方案是久经考验的,被广大开发者反复使用,并且被证明在多种场景下都是有效的。设计模式提供了一种标准化的沟通方式,使得开发者可以用统一的语言来描述问题及其解决方案。...| 单例模式: 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
Python中万物皆对象 Python是一门面向对象的语言,所以Python中数字、字符串、列表、集合、字典、函数、类等都是对象。...这就是当你使用关键字 class 时 Python 在幕后做的事情,就是通过元类来实现的。...到底什么是元类(终于到主题了) 元类就是用来创建类的【东西】。你创建类就是为了创建类的实例对象,不是吗?但是我们已经学习到了Python中的类也是对象。...__class__ Out[142]: type 因此,元类就是创建类这种对象的东西。type 就是 Python的内建元类,当然了,你也可以创建自己的元类。 7....Python会在类的定义中寻找 __metaclass__ 属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的 type 来创建这个类。
目录 1、QCalendar日历类 2、QDateTimeEdit时间类 ---- 1、QCalendar日历类 QCalendar是一个日历控件,它提供了一个基于月份的视图,允许用户通过鼠标或键盘选择日期...Qt Company中日历组件效果 QCalendar类中的常用方法如下表所示: 通个示例了解QCalendar日历类,示例效果如下所示: 示例中有日历控件和标签控件,当前选定的日期显示在标签控件中...Qt Company中时间组件效果 QDateTimeEdit类中的常用方法如下表所示: QDateTimeEdit类中的常用信号如下表所示: QDateTimeEdit类中包含QDateEdit...类和QTimeEdit类,QDateEdit类用来编辑控件的日期,仅包括年、月和日;QTimeEdit用来编辑控件的时间,仅包括小时、分钟和秒。...设置弹出日历时要注意:用来弹出日历的类只有QDateTimeEdit类和QDateEdit类,而QTimeEdit类虽然在语法上可以设置弹出日历,但不起作用。
领取专属 10元无门槛券
手把手带您无忧上云