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

Python 工匠:写好面向对象代码原则(

合理使用继承,可以大大减少之间重复代码,程序事半功倍,不当继承关系,则会之间建立起错误强耦合,带来大片难以理解和维护代码。 正是因为这样,对继承态度也可以大致分为两。...出处: Liskov substitution principle - Wikipedia 如果把它比较通俗翻译过来,大概是这样:当你使用继承时,子类(派生对象应该可以在程序替代父(基对象使用...不当继承关系如何违反 L 原则 现在,假设我们需要写一个新函数,它可以同时接受多个用户对象作为参数,批量将它们停用。...这时因为 Admin 虽然是 User 类型子类,但它 list_related_posts 方法返回却是一个可迭代生成器,并不是列表对象。而生成器是不支持 len() 操作。...要符合 L 原则,我们一定得子类方法和父返回同一结果,支持同样操作。或者更进一步,返回支持更多种操作子类型结果也是可以接受

98210

Python 字典 dict

有两个途径能帮我们达到这个目的,一个是通过 defaultdict,这个类型不是普通 dict,另一个 是给自己定义一个 dict 子类,然后在子类实现 __missing__ 方法。...也就是说,如果 有一个继承了 dict,然后这个继承提供了 __missing__ 方法,那 么在 __getitem__ 碰到找不到时候,Python 就会自动调用它, 不是抛出一个 KeyError...OrderedDict popitem 方法默认删除返回是字典里最后一个元素,但是如果像 my_odict.popitem(last=False) 这样调用 它,那么它删除返回第一个添加进去元素...collections.ChainMap 该类型可以容纳数个不同映射对象,然后在进行键查找操作时候,这些对象会被当作一个整体被逐个查找,直到键被找到为止。...更倾向于从 UserDict 不是从 dict 继承主要原因是,后者有时 会在某些方法实现上走一些捷径,导致我们不得不在它子类重写 这些方法,但是 UserDict 就不会带来这些问题。

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

自动添加标签(2):再次实现

你需要找出一些抽象,程序在变得复杂时也易于管理。下面先来列举一些潜在组件。 解析器:添加一个读取文本管理其他对象。 规则:对于每种文本块,都制定一条相应规则。...---- 注意 这里之所以使用术语处理程序(不是渲染程序等),旨在指出它负责处理解析器生成方法调用,不必像HTMLRenderer那样使用标记语言渲染文本。...换而言之,发现使用了标题规则(这表明当前文本块为标题)后,就不应再试图使用段落规则。为实现这一点,一种简单方法解析器依次尝试每个规则,并在触发一个规则后不再接着尝试。...你可编写多个独立规则和过滤器,再使用方法add_rule和add_filter将它们添加到解析器,同时确保在处理程序实现了相应方法。...5.8.整合起来 现在,只需创建一个Parser对象添加相关规则和过滤器。下面就来这样做:创建一个在构造函数完成初始化Parser子类,在使用它来解析sys.stdin。

1.7K40

PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

问题 你如何组织你代码使其可以容易添加基本或者一些很少用到 特性,不是直接不额外代码写在你内部? 3. 解决方案 装饰器模式:动态地给一个对象添加一些额外职责或者行为。...如果你拥有一族子类(从一个派生而来),你需要在与子类独立使用情况下添加额外特性,你可以使用装饰器模式,以避免代码重复和具体子类数量增加。 4....此外,为一个特定Component提供多个不同 Decorator,这就使得你可以对一些职责进行混合和匹配。使用Decorator模式可以很容易地重复添加一个特性。...你需要让你检验有效性代码也可以应用到其它部件,这样不用再更多子类上进行有效性验证。 ? 这里子类溢出并不是唯一问题。想一想那些重复代码,你需要重新设计你整个层次。有没有更好方法!...至少WidgetDecorator应该能够在它构造函数接受一个组件, * 复制公共方法paint() * */ class WidgetDecorator { protected $_widget

62920

设计模式(八)装饰器模式Decorator(结构型)

通过继承一个现有可以使得子类在拥有自身方法同时还拥有父方法。但是这种方法是静态,用户不能控制增加行为方式和时机。如果 你希望改变一个已经初始化对象行为,你怎么办?...问题 你如何组织你代码使其可以容易添加基本或者一些很少用到 特性,不是直接不额外代码写在你内部? 3....如果你拥有一族子类(从一个派生而来),你需要在与子类独立使用情况下添加额外特性,你可以使用装饰器模式,以避免代码重复和具体子类数量增加。 4....此外,为一个特定Component提供多个不同 Decorator,这就使得你可以对一些职责进行混合和匹配。使用Decorator模式可以很容易地重复添加一个特性。...至少WidgetDecorator应该能够在它构造函数接受一个组件, * 复制公共方法paint() * */ class WidgetDecorator { protected

35610

Scala语言入门:初学者基础语法指南

Null 类型是所有引用类型子类型,它只有一个实例:null。 语法 主方法一个程序入口点。JVM要求一个名为main方法接受一个字符串数组参数。你可以如下所示来定义一个方法。...包对象 在 Scala ,包对象(Package Object)是一种特殊对象,它与包同名,并且可以在包定义一些公共成员和方法,供包其他对象直接使用。...由于包对象与包同名且位于同一包,因此可以直接使用它们。 特质 在Scala是单继承,但是特质(trait)可以多继承。 这意味着,一个只能继承一个,但可以继承多个特质。...传名参数使用 => 符号来定义,以表示传递一个表达式不是具体值。 传名参数特点是,在每次使用参数时都会重新求值表达式,不是在调用函数时进行求值。...它提供了一种方法来访问集合元素,不需要暴露集合内部结构。在 Scala ,你可以使用 iterator 方法来获取一个集合迭代器。

24020

Scala语言入门:初学者基础语法指南

Null 类型是所有引用类型子类型,它只有一个实例:null。 语法 主方法一个程序入口点。JVM要求一个名为main方法接受一个字符串数组参数。你可以如下所示来定义一个方法。...包对象 在 Scala ,包对象(Package Object)是一种特殊对象,它与包同名,并且可以在包定义一些公共成员和方法,供包其他对象直接使用。...由于包对象与包同名且位于同一包,因此可以直接使用它们。 特质 在Scala是单继承,但是特质(trait)可以多继承。 这意味着,一个只能继承一个,但可以继承多个特质。...传名参数使用 => 符号来定义,以表示传递一个表达式不是具体值。 传名参数特点是,在每次使用参数时都会重新求值表达式,不是在调用函数时进行求值。...它提供了一种方法来访问集合元素,不需要暴露集合内部结构。在 Scala ,你可以使用 iterator 方法来获取一个集合迭代器。

26220

Scala语言入门:初学者基础语法指南

Null 类型是所有引用类型子类型,它只有一个实例: null。语法主方法一个程序入口点。JVM要求一个名为main方法接受一个字符串数组参数。你可以如下所示来定义一个方法。...包对象在 Scala ,包对象(Package Object)是一种特殊对象,它与包同名,并且可以在包定义一些公共成员和方法,供包其他对象直接使用。...由于包对象与包同名且位于同一包,因此可以直接使用它们。特质在Scala是单继承,但是特质(trait)可以多继承。这意味着,一个只能继承一个,但可以继承多个特质。...传名参数使用 => 符号来定义,以表示传递一个表达式不是具体值。传名参数特点是,在每次使用参数时都会重新求值表达式,不是在调用函数时进行求值。...它提供了一种方法来访问集合元素,不需要暴露集合内部结构。在 Scala ,你可以使用 iterator 方法来获取一个集合迭代器。

25520

Scala语言入门:初学者基础语法指南

Null 类型是所有引用类型子类型,它只有一个实例:null。 语法 主方法一个程序入口点。JVM要求一个名为main方法接受一个字符串数组参数。你可以如下所示来定义一个方法。...包对象 在 Scala ,包对象(Package Object)是一种特殊对象,它与包同名,并且可以在包定义一些公共成员和方法,供包其他对象直接使用。...由于包对象与包同名且位于同一包,因此可以直接使用它们。 特质 在Scala是单继承,但是特质(trait)可以多继承。 这意味着,一个只能继承一个,但可以继承多个特质。...传名参数使用 => 符号来定义,以表示传递一个表达式不是具体值。 传名参数特点是,在每次使用参数时都会重新求值表达式,不是在调用函数时进行求值。...它提供了一种方法来访问集合元素,不需要暴露集合内部结构。在 Scala ,你可以使用 iterator 方法来获取一个集合迭代器。

31410

【愚公系列】软考中级-软件设计师 048-面向对象技术(面向对象相关概念)

继承是之间一种关系,其中子类可以继承(获得)父属性和方法,同时可以添加自己独有的属性和方法。 举例说明:假设有一个Animal,它有属性name和方法sayHello()。...现在有一个子类Dog,想要重写eat()方法定义自己进食行为。子类Dog可以通过重写父eat()方法,在自己eat()方法实现狗狗特有的进食行为。...例如,在一个计算器可以有两个同名add函数,一个接受两个整数参数,另一个接受两个浮点数参数。 函数覆盖(也称为函数重写或方法重写)则是指子类重写了父同名函数。...函数重载与函数签名有关,可以在同一个中有多个同名函数,但参数类型或个数必须不同;函数覆盖则是子类重写了父同名函数,要求函数名、返回类型和参数列表都相同。...举例:想象你是一名旅行者,你需要租一辆车去探索一个城市。你不需要亲自去了解车子每个零件如何工作,你只需要知道如何使用它们。租车公司为你提供了一辆可用车,不是你去修理引擎或更换轮胎。

7900

Java编程思想精粹(On Java8)(十)-接口

当两种接口中有相同签名方法子类实现他俩时,需要覆写冲突方法可以重定义 jim() 方法,也能使用 super 关键字选择基实现一种。...3 抽象和接口 ? 抽象仍然是一个,在创建新时只能继承它一个创建过程可以实现多个接口。 尽可能地抽象 因此,更倾向使用接口不是抽象。 只有当必要时才使用抽象。...在简单情况下体现在一个方法接受接口作为参数,该接口实现和传递对象方法则交由你来做。 因此,接口一种常见用法是策略设计模式。 编写一个方法执行某些操作接受一个指定接口作为参数。...可以说:“只要对象遵循接口,就可以调用方法” ,这使得方法更加灵活,通用,更具可复用性。 例如, Scanner 构造器接受一个 Readable 接口。 ?...因为你可以以这种方式在已有增加新接口,所以这就意味着一个接受接口类型方法提供了一种任何可以与该方法进行适配方式。这就是使用接口不是强大之处。

42120

Java编程思想精粹(九)-接口

当两种接口中有相同签名方法子类实现他俩时,需要覆写冲突方法可以重定义 jim() 方法,也能使用 super 关键字选择基实现一种。...3 抽象和接口 ? 抽象仍然是一个,在创建新时只能继承它一个创建过程可以实现多个接口。 3.1 尽可能地抽象 因此,更倾向使用接口不是抽象。 只有当必要时才使用抽象。...在简单情况下体现在一个方法接受接口作为参数,该接口实现和传递对象方法则交由你来做。 因此,接口一种常见用法是策略设计模式。 编写一个方法执行某些操作接受一个指定接口作为参数。...可以说:“只要对象遵循接口,就可以调用方法” ,这使得方法更加灵活,通用,更具可复用性。 例如, Scanner 构造器接受一个 Readable 接口。 ?...因为你可以以这种方式在已有增加新接口,所以这就意味着一个接受接口类型方法提供了一种任何可以与该方法进行适配方式。这就是使用接口不是强大之处。

50121

JavaSE笔记

,需要手动使用后才执行,该过程称为方法调用 方法注意事项 方法不能嵌套定义 方法重载 方法重载指同一个定义多个方法之间关系,满足下列条件多个方法相互构成重载 多个方法在同一 多个方法具有相同方法名...获取数量 array.size() 返回集合元素个数 继承 特点 子类只能继承一个可以多个子类 this this.成员变量 访问本类成员变量 this(...)...在局部位置:局部内部类 局部内部类是成员方法定义,外界是无法直接使用,需要在方法内部创建对象使用 该类可以直接访问外部类成员,也可以访问方法局部变量 匿名内部类 匿名内部类也是局部内部类...public E removeFirst() 此列表删除返回第一个元素 public E removeLast() 此列表删除返回最后一个元素 List集合子类特点 List集合常用子类:ArrayList...重写hashCode()方法可以实现不同对象哈希值相同 如何保证唯一性 HashSet原理 我们使用Set集合都是需要去掉重复元素, 如果在存储时候逐个equals()比较, 效率较低,哈希算法提高了去重复效率

1.3K21

【深入浅出C#】章节 4: 面向对象编程基础:封装、继承和多态

使用return语句可以将结果返回给调用者。 方法重载: 在一个可以定义多个同名但参数列表不同方法,这称为方法重载。方法重载可以根据不同参数类型和数量来执行不同逻辑。...方法重载指在同一个定义多个具有相同名称但参数列表不同方法。...这样,在同一个定义了多个具有相同名称但参数列表不同方法,实现了多态性。根据实际参数类型,调用相应方法,从而实现不同行为。这就是方法重载实现多态性一种方式。...接口和抽象 接口是一种实现多态性方式,它定义了一组方法和属性规范,不包含具体实现。一个可以实现一个多个接口,并提供接口中定义方法和属性具体实现。...4.2 继承用法和继承链构建 继承是面向对象编程重要概念,它允许一个子类)继承另一个(父属性和方法,并可以添加自己额外功能。

44230

Python 进阶指南(编程轻松进阶):十六、面向对象编程和继承

类似于函数,继承是一种代码重用技术,您可以将其应用于。这是将置于父子关系行为,在这种关系子类继承父方法副本,使您不必在多个复制一个方法。...组合是一种设计技术,它将对象包含在不是继承那些对象。这就是我们在给添加属性时所做事情。当使用继承设计你时,支持组合不是继承。...我们可以创建一个Vehicle,Car、Motorcycle和LunarRover继承它,不是将这些代码复制粘贴到每个。...例如,如果构造器既可以接受对象需要数据字符串,也可以接受包含新对象需要数据文件名字符串,会怎么样呢?我们不希望__init__()方法参数列表冗长混乱。...使用组合不是继承通常更灵活,因为它实现了与一个对象和其他对象“有”关系,不是直接从那些其他继承方法。这意味着一个对象可以拥有另一个对象

51920

诺,你们要Python进阶来咯!【函数、进阶必备】

即: 对象 = () 对象.属性 对象.方法() 除此之外,还有一种绑定在这个层面的属性和方法,叫作类属性和方法使用类属性和方法时,不用创建对象,直接通过使用。...我们可以通过该参数来引用类属性,或其它方法方法可以使用该类类属性,但不能使用该类对象属性。因为方法隶属于,而对象属性隶属于对象使用方法时可能还没有对象被创建出来。...和 digits 是为了提供给同一个方法使用,但我们可以通过对象外部直接访问它们。...被继承叫作父(或基),继承者叫作子类(或派生)。关于简单继承可以看下图就是一个典型例子: 在继承定义时,子类名称后面加上括号写入父。...,不是实例化后对象

48620

Java抽象与oop三大特征

如果一个继承了某个抽象,则子类必定是抽象种类,接口实现则是有没有、具备不具备关系。...对于抽象,如果需要添加方法可以直接在抽象添加具体实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口都必须进行相应改动。...重载 overloading 方法重载是 以统一方式处理不同类型数据 一种手段。多个同名函数同时存在,具有 不同参数个数/类型 。...重载是一个多态性一种表现; Java 方法重载,就是在可以创建多个方法,它们具有相同名字,但具有不同参数和不同定义。..., 被引用对象类型 不是引用变量类型决定了调用谁成员方法, 但是这个被调用方法必须是在超定义过 ,也就是说被调用方法必须是 被子类重写方法

77440

诺,你们要Python进阶来咯!【进阶必备】

即: 对象 = () 对象.属性 对象.方法() 除此之外,还有一种绑定在这个层面的属性和方法,叫作类属性和方法使用类属性和方法时,不用创建对象,直接通过使用。...我们可以通过该参数来引用类属性,或其它方法方法可以使用该类类属性,但不能使用该类对象属性。因为方法隶属于,而对象属性隶属于对象使用方法时可能还没有对象被创建出来。...和 digits 是为了提供给同一个方法使用,但我们可以通过对象外部直接访问它们。...被继承叫作父(或基),继承者叫作子类(或派生)。关于简单继承可以看下图就是一个典型例子: ? 在继承定义时,子类名称后面加上括号写入父。...,不是实例化后对象

38430

java多态

这种多态性是通过方法重载和覆盖实现方法重载方法重载是指在同一个定义多个方法,这些方法具有相同名称但是参数列表不同。当调用这些方法时,编译器会根据参数类型和数量来确定应该调用哪一个方法。...当我们需要编写多个类似的方法时,可以使用方法重载来避免编写大量重复代码。当我们需要编写多个类似的时,可以使用继承来避免编写大量重复代码。提高代码复用性多态可以提高代码复用性。...当我们需要编写一个通用方法时,可以使用接口来定义方法规范,然后多个实现这个接口。这样,我们就可以在不修改方法情况下,通过传递不同对象来执行不同行为。...提高程序可扩展性多态可以提高程序可扩展性。当我们需要添加功能时,可以通过添加和接口来实现这个功能,不需要修改现有的代码。四、多态注意点多态只适用于方法调用,不适用于属性访问。...当我们访问对象属性时,实际访问对象本身属性,不是对象子类属性。静态方法不能被重写,因此静态方法不具备多态性。

45040
领券