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

Python协议 、鸭子类型 、 抽象 、混入

本篇文章探讨一下python几个概念:协议 、鸭子类型 、 抽象 、混入。 一、协议 在python,协议是一个或一组方法。...通过输出结果就能看出,Eg1对象可以计算长度,也可以循环处理,这和正常序列没什么不同。因此我们可以把Eg1称为一个鸭子类型,即 只关注它是否实现了相应协议,不关注它类型。...Dog和Bird在实例化之后调用相同方法,但是却有不同输出,这就是最简单抽象用法。...概念上讲,混入不定义新类型,只是打包方法,便于重用。混入应该提供某方面的特定行为,只实现少量关系非常紧密方法并且混入绝对不能实例化。...Django在这方面做很好,举一个例子, ListView主要用于数据库获取多条记录,它继承关系如下: ? 整个体系非常清晰,各个职责也非常明确,且职责从命名就可以读出。

1.8K20

创建子类对象时,父构造函数调用子类重写方法为什么调用子类方法

static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象时候父调用子类方法...但是:创建B对象父调用方法? 答案: 当子类被加载到内存方法区后,会继续加载父到内存。...如果,子类重写了父方法子类方法引用会指向子类方法,否则子类方法引用会指向父方法引用。 如果子类重载了父方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父方法,则方法引用会指向父方法。 当子类对象创建时,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,父构造方法调用方法参数已经强制转换为符合父方法参数了。 上边代码在编译前已经转换为下面这个样子了。

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

构造函数调用子类方法,写过

为什么Base构造函数与虚构函数即使调用虚函数,也是调自己函数呢?这跟构造函数与虚构函数调用顺序有关。子类对象构造时候,先调父构造函数初始化父,再调子类构造函数初始化子类。...子类对象虚构时候,恰恰相反,先调子类对象虚构函数,再调父虚构函数。输出结果也证明了这点。 所以如果父构造函数与虚构函数是调用子类函数,那就非常危险了。...因为父构造函数执行时,子类构造函数还没有执行,说明子类还没有初始化,而这时就调用子类方法,很容易出错,甚至崩溃。...父虚构函数执行时候,子类虚构函数已经执行完毕,说明子类资源已经被释放,而这时继续执行子类方法,也很容易崩溃。于是,C++规范为此作了此约束。...如果真的很想在构造函数内调用子类方法进行初始化,还是显示提供一个初始化函数,让子类对象实例化完后,显示调用初始化函数。

1.4K20

Python_子类调用方法

1.方式一 子类调用方法,包含2形式调用。一种形式是在内部通过继承方式调用方法,另外一种形式是子类实例化后之后通过继承方式来调用方法。如下图所示: ?...3班") #调用子类本身方法 student.course() #通过子类调用方法--->实例化之后来调用方法 student.eat() #调用子类方法,在子类方法调用子类方法,...使用super好处,一是可以代替父名,这样后期父名更改了,我们只需要更改子类名称后面的父名即可,子类其他可以不用更改;二是使用了super后,调用方法可以不传参数self。...#子类调用方法 super().eat() #子类调用方法,使用super可以省略self #实例化一个子类 student = Student("周明",23,'男',..."11届土木3班") #调用子类本身方法 student.course() #通过子类调用方法--->实例化之后来调用方法 student.eat() #调用子类方法,在子类方法调用子类方法

4.8K20

子类调用同名方法和属性

Python面向对象,利用子类调用同名方法和属性。...首先我们定义了两个父,Master和School # @author: 北山啦 # FileName: 12子类调用同名方法 # @time: 2022/6/5 14:54 #父Master...,子类如何来调用呢 在这里,定义Prentice,继承了Master和School,添加了和父类同名属性和方法 调用子类属性和方法 如果调用了父属性和方法,父类属性会自动掩盖子类属性,股灾调用属性前...__init__ print(f'运用{self.kongfu}制作煎饼果子') 调用父类属性和方法 如果调用方法,但是为了保障调用是父属性,必须在方法调用初始化...__init__ print(f'运用{self.kongfu}制作煎饼果子') '''调用方法,但是为了保障调用是弗列属性,必须在方法调用初始化'''

1.8K20

关于使用MethodHandle在子类调用祖父重写方法探究

关于使用MethodHandle在子类调用祖父重写方法探究 注:这个例子原本出现在周志明先生《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...关于这段代码,可以简单理解findSpecial方法是为了找到方法,invoke是为了调用方法。...在普通方法调用,这个this参数是虚拟机自动处理,表示是当前实例对象,我们在方法可以直接使用。...基于这个事实,我们这时可以直接在GrandFatherthinking方法调用Son独有的方法,使用反射或者直接类型强制转换为Son就行了。...这个参数中指定方法接收者类型,bindTo指定接收者类型必须要是这个子类,不然会出现ClassCastException异常。

9.4K30

一个简单方法:截取子类名称不包含后缀部分

是 MenuItem,子类是 WalterlvMenuItem、FooMenuItem。...在代码,我们可能会为了能够一眼看清之间继承(从属)关系而在子类名称后缀带上名称。但是由于这种情况下不参与实际业务,所以对外(文件/网络)名称通常不需要带上这个后缀。...本文提供一个简单方法,让子类后缀删掉,只取得前面的那部分。 在这段代码,我们至少需要获得两个传入参数,一个是名称,一个是子类名称。...另外,我们还需要有一些约束,必须有一个类型是另外一个类型子类。于是我们可能必须来使用泛型做这样约束。.../// internal static class ClassNameUtils { /// /// 当某个类型派生都以

20930

静态方法只能通过名进行调用_java非静态方法可以调用静态方法

静态方法调用三种方式: 1、new xx().静态(); //使用对象调用,不推荐 2、xx.静态(); //调用,正规调用方法,推荐 3、静态(); //本类静态方法在本类调用,直接调用...注意事项: 在同包不同类调用时候,可以直接 名.方法() 调用,无需创建对象。...在不同包调用时候,需要引包再调用。 欢迎各位在评论区留言探讨 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。...如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

1.1K10

python中子类调用初始化方法

如果一个方法子类实例中被调用,或者一个属性在子类实例中被访问,但是该方法或属性在子类并不存在,那么就会自动去其父中进行查找。...子类不显式调用构造方法,而父构造函数初始化了一些属性,就会出现问题 如果子类和父都有构造函数,子类其实是重写了父构造函数,如果不显式调用构造函数,父构造函数就不会被执行,导致子类实例访问父初始化方法初始变量就会出现问题...方法一更直观,方法可以一次初始化所有超 super函数比在超累中直接调用未绑定方法更直观,但是其最大有点是如果子类继承了多个父,它只需要使用一次super函数就可以。...二、第二种解释     在Python中子类继承父过程,如果子类不覆盖父__init__()方法,则子类默认将执行与父一样初始化方法。...但是假如子类自己重写 了(也成为覆盖)父__init__()方法,那么就需要显式调用初始化方法了。有两种方法可以做到:      1:ParentClass.

2.1K10

Java加载机制---父子类多态调用

null 1) 上面程序最大难点,也是最重要地方就是:在父构造函数调用了虚函数,并且这个函数被子类重载了 2) 继承时候,子类与父有着同名属性和同名方法,关于同名属性初始化过程也是必须要了解...同名属性会不会被覆盖掉,同名方法就是多态,同名方法之间调用是怎么样。...上面的程序就很容易理解为什么输出是null了 Java机制里面有这样一个原则就是:如果父存在,子类可以不存在;如果子类存在,父必须存在; 怎么理解上面的这句话呢,可以用实际例子来说明,一个人结婚了但是没有小孩...;同名方法是多态,只会去调用子类重载方法, 这个规则说白了,就是当有父子类时候,必须都所有的存储空间都分配好了,才能执行  属性初始化,继而是构造函数;同时要明白一点,子类构造函数是在父构造完成之后才会去执行...,多态调用 7)子类有重载,所以调用子类方法,但是子类baseName还没有初始化,所以就没有直接打出null了 8)父创建完毕,接下来就是去执行子类创建工作了, 9)首先为子类属性进行初始化

2.7K40

子类可以继承到父注解--有结论了

子类可以继承到父注解?...("子类覆盖父doHandle方法,没有继承到父doHandle方法Annotation"); } } } 编写自定义注解时未写@Inherited运行结果...抽象方法,没有继承到父抽象方法Annotation 子类继承父doExtends方法,继承到父doExtends方法Annotation,其信息如下:父doExtends方法 子类覆盖父...------------------------------- 子类继承到父上Annotation,其信息如下:名上注解 子类实现父abstractMethod抽象方法,没有继承到父抽象方法...Annotation 子类继承父doExtends方法,继承到父doExtends方法Annotation,其信息如下:父doExtends方法 子类覆盖父doHandle方法,没有继承到父

2.8K30

Python 在子类调用方法详解(单继承、多层继承、多重继承)

测试环境: win7 64位 Python版本:Python 3.3.5 代码实践: 1、在子类通过“名”调用方法 class FatherA: def __init__(self)...__init__(self) # 在子类调用方法:父名.方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果: >>> ==...(如SubClassB由FatherA变为FatherD时),必须遍历整个定义,把子类中所有的父名全部替换过来 2、在子类通过“super”方法调用方法 场景1、单层继承 class...__init__() # 在子类调用方法:super().方法名称(参数) if __name__ == '__main__': b = SubClassB() class FatherA...,子类水平方向上,继承多个父,以super().method(参数)方法调用方法,如果不同父存在同名方法method(不管参数列表是否相同),则按继承顺序,选择第一个父方法

2.9K30

【BAT面试题典】子类可以继承到父注解

子类重写父方法后,可以继承方法注解?...这个不急,让我来分析一下,假设有如下注解: 定义被注解 子类直接继承父 获取父子类方法注解信息,并输出注解value属性值 日志输出 可见子类子类方法,无法自动继承父和父方法注解...相反,遵循find语义方法将完全忽略@Inherited存在,因为find搜索算法手动遍历类型方法层次结构,从而隐式支持注解继承,而无需@Inherited。...Find V.S Get Semantics 此类方法使用搜索算法遵循find或get语义。...如果带注解元素是方法,则在超搜索方法 如下俩方法其实也很相像,有何区别呢?

67510

Java抽象和接口中可以有构造方法?

Java抽象和接口中可以有构造方法?...在抽象可以有构造方法,只是不能直接创建抽象实例对象, 但实例化子类时候,就会初始化父,不管父是不是抽象都会调用构造方法,初始化一个,先初始化父。...父构造方法不能被子类调用可以通过super语句调用构造方法。 E. 构造方法可以重载,以参数个数、类型、顺序,分为空参构造方法和有参构造方法。...继承抽象可以是普通,但必须重写抽象所有抽象方法,也可以是抽象,无需重写抽象所有抽象方法。...注: 可以说是一种特殊抽象,里面的方法全是抽象方法子类实现接口必须对接口中方法全部重写。

2K10

【Kotlin】Kotlin 继承 三 ( super 关键字使用 | super@ 外部调用方法 | 子类选择性调用 接口 方法 super )

子类调用 : 子类可以任意调用 public , protected 可见性属性与方法 ; 3 ....子类调用方法 ( super ) ---- 子类调用方法 : 子类可以通过 super 调用方法 , 包括普通方法 , 和属性访问 setter 方法 ; 其中 super 相当于父对象引用...子类内部类调用方法 ( super@ ) ---- 子类内部类调用方法 : 在子类内部类 , 如果想要访问父方法 , 可以使用 super@子类名称.父方法() 形式 , 调用方法...子类选择性调用 / 接口方法 : 子类可以继承父 , 实现多个接口 , 如果父与接口 , 或者不同接口之间定义了相同名称方法 , 那么需要使用 super.方法名() 选择调用指定...代码示例 : 代码定义了一个父 Father , 接口 Build , 父和接口 都定义了 action 方法 , 子类 Son 继承父 , 实现 Build 接口 , 子类通过 super 调用成员或方法

1.2K10

date和calendar区别_java可以定义

Date 在JDK1.0,Date是唯一一个代表时间,但是由于Date不便于实现国际化,所以JDK1.1版本开始,推荐使用Calendar进行时间和日期处理。...Date默认构造方法创建出对象就代表当前时间,由于Date覆盖了toString方法,所以可以直接输出Date类型对象,显示结果如下:...); System.out.println(d4); 使用Date对象getTime方法可以将Date对象转换为相对时间,使用Date构造方法可以将相对时间转换为...Calendar是一个抽象,在实际使用时实现特定子类对象,创建对象过程对程序员来说是透明,只需要使用getInstance方法创建即可。...如果只设定某个字段,例如日期值,则可以使用如下set方法: public void set(int field,int value) 在该方法,参数field代表要设置字段类型

1.2K20

没想到吧,PHP 外部也可以调用私有方法

一般来说,在 Class 外部是无法调用私有方法,这也是 Private 字面的意思,但是一些很特殊很特殊情况下,如果需要调用,是否可以呢?其实可以使用反射来实现。...reflection->getClosure($object); } return call_user_func_array($callback, $args); } 简单解释一下,首先还是简单判断该方法是否存在...,接着获取对象方法放射,然后判断一下是不是公共方法,如果是公共就正常调用,不是则获取其闭包,最后使用回调方式来调用。...这个函数可以让你调用对象私有或者受保护方法,建议一些特殊情况下才使用。为了方便大家调用,新版 WPJAM Basic 也会集成该函数。----

99530
领券