首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python如何设计面向对象(上)

Python是一门高级语言,支持面向对象设计,如何设计一个符合Python风格面向对象,是一个比较复杂问题,本文提供一个参考,表达一种思路,探究一层原理。...@classmethod用法是:定义操作,而不是操作实例方法。常用来定义备选构造方法。 @staticmethod其实就是个普通函数,只不过刚好放在了定义体里。...但是更符合Python风格做法是定义子类: class ShortVector2d(Vector2d): typecode = 'f' Django基于视图大量使用了这个技术。...小结 本文先介绍了如何实现特殊方法来设计一个Python风格,然后分别实现了格式化显示与可散列对象,使用__slots__能为节省内存,最后讨论了类属性覆盖技术,子类覆盖是Django基于视图大量用到技术...参考资料: 《流畅Python》第9章 符合Python风格对象 https://www.jianshu.com/p/7fc0a177fd1f

89830

Python 设计起源自哪里?

但是,他也提到,他并不知道学习哪种语言,可以加深对 Python设计理解。 这其实意味着,Python 设计有着很大原创性,并非借鉴自哪种语言成熟设计!...既然不是从其它语言中学习来,那么,Python 思想到底起源自哪里呢?Guido 不会是“无中生有”开创出来设计吧?...python-ideas 上有人猜测 Python 设计是起源自 Ruby。事实并非如此。既然是关于语言特性起源,我觉得我有必要来澄清下事实。...但即便是在 Python 最初设计中(1990 年,发布于 1991 年),类型(type)本身就是一个对象。...当时我对 Smalltalk 只有模糊了解;当我后来读到它设计时,我感到很惊讶,因为它与 Python 或 Ruby 中有很大不同!

38420
您找到你想要的搜索结果了吗?
是的
没有找到

Python如何设计面向对象(下)

本文将在上篇文章二维向量Vector2d基础上,定义表示多维向量Vector。...超过6个元素用...来表示。 第2版:支持切片 Python协议是非正式接口,只在文档中定义,在代码中不定义。...比如Python序列协议只需要__len__和__getitem__两个方法,Python迭代协议只需要__getitem__一个方法,它们不是正式接口,只是Python程序员默认约定。...小结 经过上下两篇文章介绍,我们知道了Python风格是什么样子,跟常规面向对象设计不同是,Python通过魔法方法实现了Python协议,使Python在使用时能够享受到语法糖,不用通过...参考资料: 《流畅Python》第10章 序列修改、散列和切片

51830

Python学习笔记整理(十六) 设计

如何使用来对有用对象进行建模? 一、Python和OOP Python和OOP实现可以概括为三个概念。...从设计角度看,继承是一种定义集合成员关系方式:定义了一组内容属性,可由更具体集合(子类)继承和定制。 子类和超继承是1对1关系....在Python中,委托通常是以__getattr__钩子方法实现,因为这个方法会拦截对不存在属性读取,包装(代理)可以使用__getattr__把任意读取转发给包装对象。...当这么做时,就在使用所谓多重继承:和其实例继承了列出所有超变量。搜索属性时,Python会由左到右搜索首行中,直到找到相符者。...这类函数在OOP设计领域偶尔称为工厂。 工厂式函数或程序代码,在一些情况下很方便,因为他们可以让我们取出并传入没有预先在程序代码中硬编码。实际上,这些在编写程序时可能还不存在。抽象

66310

Python 关于函数设计一点总结

/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:

31110

Python「面向对象」和对象基本概念和关系、设计方法

---- 三、设计 都知道面向对象开发出来程序最终结果是不同对象调用不同方法。在面向对象中想要创建出对象,得先有,那是怎么样设计出来?下面开始慢慢说明。...在程序开发中,要设计一个,通常需要满足以下三个要素: 1. 名:这类事物名字,满足大驼峰命名法 2. 属性:这类事物具有什么样特征 3....提示:需求中没有涉及属性或者方法在设计时,不需要考虑 ---- 练习1: 需求: 小明今年20岁,身高180cm,每天早上跑完步,会去吃东西 小菜今年18岁,身高165cm,小菜不跑步,小菜喜欢吃东西...解答:设计一个人类,属性包含名字、年龄、身高,行为包含跑和吃,再创建两个不同对象。...---- 练习2: 需求: 一只黄色狗狗叫大黄 见到生人 汪汪叫 见到家人 摇尾巴 解答:设计一个狗,属性是名字和厌恶,行为是汪汪叫和摇尾巴。

64230

设计SOLID原则

其基础是内聚,表示完成单一功能程度。 开放—封闭原则(Open Closed Principle,OCP):应该对扩展开放,对修改关闭。是SOLID原则中最重要一个。...发布接口   接口要更接近使用它们,   发布接口是由导出包中公开公开方法组成,它可以被其他模块调用。   使用标准JAVA,阻止外部类访问你不想公开或方法最简单方式就是使用接口。...抽象化模块   通过在新模块中,定义新来实现或扩展抽象体,能够更容易地扩展和维护应用。只依赖模块抽象元素会付出一定代价:创建实现实例时不能再使用new关键字了。...如下场景下会更好:第一种,在Web应用程序中,如果想在服务器启动时候创建一些特定,可以使用Class并且在启动属性文件中指定要实例化具体,通过指定新并将其全限定名设置在适当属性文件中,...如果依赖抽象体所有位于多个模块中,那么将抽象体放在一个单独模块中,这个模块与依赖抽象体实现了分离。包含实现模块要依赖包含抽象体模块。

99700

设计线程安全

设计线程安全: 在设计线程安全过程中,需要包含以下三个基本要素: 找出构成对象状态所有变量; 找出约束状态变量不变性条件; 建立对象状态并发访问管理策略。...当从头开始构建一个或者将多个非线程安全组合成一个时,监视器模式非常有用。但如果类中各个组件已经是线程安全,会是什么情况?...在某些情况下通过多个线程安全组合而成是线程安全,而在某些情况下不是。 如果某个含有复合操作,那么仅靠委托并不足以实现线程安全性。...如果一个是由多个独立且线程安全状态变量组成,并且在所有的操作中都不包含无效状态转换,那么可以将线程安全性委托给低层状态变量。...发布低层状态变量: 当把线程安全性委托给某个对象底层状态变量时,什么条件下可以发布这些变量从而使其他可以修改它们?答案仍然取决于在中对这些变量施加了什么不变性条件。

85140

设计模式——图以及之间关系

设计模式在程序设计上有着很重要作用,使用设计模式可以使得代码更容易被理解,使得代码更规范,真正实现工程化。...一、用UML表示一个 图一般是三行结构: 名称 属性:格式(可见性 名称:类型[=缺省值]) 方法:格式(可见性 名称(参数列表)[返回类型]) 注:在Visio中图中使用是C#数据类型...二、之间关系 之间主要有6种关系,包括依赖,关联,聚合,组合,继承,实现。他们耦合度是一次增强。...依赖关系主要有3种表现形式:(以A中使用了B为例) B是作为A方法参数 B是A方法中局部变量 在A中调用B静态方法 在依赖中使用是“虚线+箭头”。...设计模式中关系(http://blog.csdn.net/zhengzhb/article/details/7187278)

1.2K40

设计模式——图以及之间关系

设计模式在程序设计上有着很重要作用,使用设计模式可以使得代码更容易被理解,使得代码更规范,真正实现工程化。 一、用UML表示一个 ?...图一般是三行结构: 名称 属性:格式(可见性 名称:类型[=缺省值]) 方法:格式(可见性 名称(参数列表)[返回类型]) 注:在Visio中图中使用是C#数据类型,与Java略有差别...二、之间关系 之间主要有6种关系,包括依赖,关联,聚合,组合,继承,实现。他们耦合度是一次增强。...依赖关系主要有3种表现形式:(以A中使用了B为例) B是作为A方法参数 B是A方法中局部变量 在A中调用B静态方法 ? 在依赖中使用是“虚线+箭头”。...设计模式中关系(http://blog.csdn.net/zhengzhb/article/details/7187278)

1.3K40

特殊设计

设计不能被拷贝 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 { // .... }; 设计只能创建一个对象(单例) 饿汉模式 构造函数私有,在静态区创建一个对象, 简单,没有线程安全问题 一个程序中,多个单例,并且有先后创建初始化顺序要求时

30910

混合设计

理论强烈建议父和子类使用相同方法名来表示特定行为,从而让子类重写父。我们之后会看到,在JavaScript代码中这样做会降低代码可读性和健壮性。 设计模式 “”是设计模式?...你可能从来没把作为设计模式来看待,很多人对设计模式印象恐怕是迭代器模式、观察者模式、工厂模式、单例模式等等。...并不是所有语言都是有这个概念,比如JavaScript在es6之前就没有class) 我们熟知优秀设计模式,看起来是在(低级) 面向对象基础上实现了所有(高级)设计模式,似乎面向对象是优秀代码基础...为了满足对于设计模式最普遍需求,JavaScript提供了一些近似语法 虽然有近似语法,但是JavaScript机制似乎一直在阻止你使用设计模式。...通常来说,尽量避免使用这样结构,以保证代码整洁和可维护性。 小结 是一种设计模式。许多语言提供了对于面向软件设计原生语法。

15520

如何设计优雅结构

但应该尽可能保证封装特性。 应该尽可能「小」 在函数那一章我们提到过方法应该设计尽可能小,我们衡量函数使用代码行数,在这里我们衡量使用「职责」。...诚然,当我们修改了获取lastFocus组件方法时,往往是要修改版本号,但是反过来就不一定了。 SRP是OOP中最重要设计理念之一,但同时也是最常被违反理念之一。...一个所有方法都操作了这个所有实例变量,那么这个就是聚合型最高。 但是,通常来说这样超级内聚不太可能出现,也不建议去建立这样。...所以,一旦你内聚性降低时,就去着手把它拆分为更小吧。 所以,拆分类可以从拆分超级方法开始,这样往往能给我们带来一个更清晰组织结构。 为了变化而设计 对于大多数系统,变化是持续发生。...每次发生改变,都可能对我们现有系统造成威胁,那么我们设计系统中「组织结构」时就要尽可能降低这种风险。 然后在这个小节作者举了个使用abstract来解决对修改问题。

1K60

【C++】特殊设计

特殊设计 一、设计一个不能被拷贝 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。...: int main() { HeapOnly* hp = HeapOnly::CreateObj(); return 0; } 三、设计一个只能在栈上创建对象...首先我们先了解一下设计模式。 设计模式:设计模式(Design Pattern)是一套被反复使用、多数人知晓、经过分类、代码设计经验总结。...使用设计模式目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程基石脉络,如同大厦结构一样。...,static 成员不算该类成员,静态成员变量属于所有对象,属于整个,即属于整个 Singleton

8310

探寻Python鼻祖——元

Python中万物皆对象 Python是一门面向对象语言,所以Python中数字、字符串、列表、集合、字典、函数、等都是对象。...这就是当你使用关键字 class 时 Python 在幕后做事情,就是通过元来实现。...到底什么是元(终于到主题了) 元就是用来创建【东西】。你创建就是为了创建实例对象,不是吗?但是我们已经学习到了Python也是对象。...__class__ Out[142]: type 因此,元就是创建这种对象东西。type 就是 Python内建元,当然了,你也可以创建自己。 7....Python会在定义中寻找 __metaclass__ 属性,如果找到了,Python就会用它来创建Foo,如果没有找到,就会用内建 type 来创建这个

79810

Python Qt GUI设计:QCalendar日历和QDateTimeEdit时间(基础篇—20)

目录 1、QCalendar日历 2、QDateTimeEdit时间 ---- 1、QCalendar日历 QCalendar是一个日历控件,它提供了一个基于月份视图,允许用户通过鼠标或键盘选择日期...Qt Company中日历组件效果 QCalendar常用方法如下表所示: 通个示例了解QCalendar日历,示例效果如下所示: 示例中有日历控件和标签控件,当前选定日期显示在标签控件中...Qt Company中时间组件效果 QDateTimeEdit常用方法如下表所示: QDateTimeEdit常用信号如下表所示: QDateTimeEdit中包含QDateEdit...和QTimeEdit,QDateEdit用来编辑控件日期,仅包括年、月和日;QTimeEdit用来编辑控件时间,仅包括小时、分钟和秒。...设置弹出日历时要注意:用来弹出日历只有QDateTimeEdit和QDateEdit,而QTimeEdit虽然在语法上可以设置弹出日历,但不起作用。

2.1K30

探寻Python鼻祖——元

Python中万物皆对象 Python是一门面向对象语言,所以Python中数字、字符串、列表、集合、字典、函数、等都是对象。...这就是当你使用关键字 class 时 Python 在幕后做事情,就是通过元来实现。...到底什么是元(终于到主题了) 元就是用来创建【东西】。你创建就是为了创建实例对象,不是吗?但是我们已经学习到了Python也是对象。...__class__ Out[142]: type 因此,元就是创建这种对象东西。type 就是 Python内建元,当然了,你也可以创建自己。 7....Python会在定义中寻找 __metaclass__ 属性,如果找到了,Python就会用它来创建Foo,如果没有找到,就会用内建 type 来创建这个

90100
领券