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

禁止 Python 子类覆盖方法

当子类试图覆盖的时候,可以通过类型标注来发出警告。今天,我们来讲讲如何直接禁止覆盖。 Python 原生是没有提供禁止子类覆盖方法的功能,因此我们需要自己来实现。...先来看一下实现效果: 在这段代码里面,我们禁止子类覆盖的dead()和eat()方法,但不禁止move方法。所以,当我们在子类Dog里面尝试覆盖中的dead()时,程序就报错了。...具体要覆盖哪些方法,可以在定义的时候指定,传入的参数metaclass=protect('方法1', '方法2', '方法3', ...)就可以了。 那么这个protect函数是个什么东西呢?...在__new__里面,我们拿到了子类要定义的方法,并且检查他们是不是在我们传给protect的列表里面。如果在,说明这个方法不能被覆盖。...当实现我们自己的Animal的时候,由于meta.has_base为 False,所以不会触发检查逻辑。

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

    python之类的重写方法与调用方法

    下面我们来介绍一下python的的重写方法与调用方法。...---- 二、重写方法与调用方法   在继承关系中,子类会自动继承中定义的方法,但如果中的方法功能不能满足需求,就可以在子类中重写方法。...即子类中的方法覆盖中同名的方法,这也称为重载。...2.子类调用方法   如果需要在子类中调用方法,可以使用内置函数super()或通过“名.方法名()”的方式来实现。 例:子类调用方法示例。...---- 三、参考 1、廖雪峰的官网 2、python官网 3、Python编程案例教程 ---- 四、总结   以上就是就是关于Python的重写方法与调用方法相关知识,可以参考一下,觉得不错的话

    2.7K30

    一日一技:如何禁止 Python 子类覆盖方法

    在昨天的文章里面,我们讲到了,当子类试图覆盖的时候,可以通过类型标注来发出警告。今天,我们来讲讲如何直接禁止覆盖。...Python 原生是没有提供禁止子类覆盖方法的功能,因此我们需要自己来实现。 先来看一下实现效果: 在这段代码里面,我们禁止子类覆盖的dead()和eat()方法,但不禁止move方法。...所以,当我们在子类Dog里面尝试覆盖中的dead()时,程序就报错了。...具体要覆盖哪些方法,可以在定义的时候指定,传入的参数metaclass=protect('方法1', '方法2', '方法3', ...)就可以了。 那么这个protect函数是个什么东西呢?...在__new__里面,我们拿到了子类要定义的方法,并且检查他们是不是在我们传给protect的列表里面。如果在,说明这个方法不能被覆盖

    1.5K40

    Android 通过 JNI 调用 Java 的构造方法方法

    Android 还可以通过 JNI 来调用 Java 一个的构造方法,从而创建一个 Java 。 调用构造方法 调用构造方法的步骤和之前调用的实例方法步骤类似,也需要获得对应的方法 id。...通过这种方法,同样可以创建一个 Java 中的。 调用方法 可以通过 JNI 来调用的实例方法。...具体看代码: /** * 调用方法 * 创建一个子类,由子类去调用方法 */ extern "C" JNIEXPORT void JNICALL Java_com_glumes_cppso_jnioperations_InvokeConstructorOps_callSuperMethod...animal_cls; // 的类型 jmethodID animal_mid; // 被调用的方法 id // 获得对应的 animal_cls = env->...Animal 的子类,首先由 NewObject 方法创建 Cat ,然后调用它的方法

    2.7K20

    Python继承(调用成员与方法

    python中的初始化方法是__init__(),因此子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用的初始化函数,如果子类实现这个函数,就覆盖的这个函数,既然继承,就要在这个函数里显式调用一下的...__init__(),这跟C++,jAVA不一样,他们是自动调用初始化函数的。...调用函数有以下方法: Python class Animal():     def __init__(self, name):         self.name = name       def...).parent_attribute(arg) 【不需要写self】 3.在定义中调用本类的方法,可以直接 super().parent_method(arg) 【个人推崇这种写法】 样例如下:...dog.saySomething()     dog.animal_say_1()     dog.animal_say_2()     dog.animal_say_3()     # 子类对象调用被覆盖方法

    5.6K41

    一日一技:如何让 Python 提醒你不能覆盖某个方法

    在前几天的文章:一日一技:在 Python 里面如何实现一个抽象中,我们讲到Python 可以实现一个抽象。抽象里面有一些抽象方法,在继承这个抽象的时候,子类必须实现这些抽象方法。...有时候,我们希望在中保留一些方法,子类在继承的时候,不准覆盖这些方法。这个功能,在 Java 中叫做@final。 Python 原生的语句和关键词,无法禁止开发者覆盖的某个方法。...: print('狗不会死亡') wangcai = Dog('旺财') wangcai.walk() wangcai.dead() 运行效果如下图所示: 可以看到,子类Dog覆盖...现在,我不想让开发者覆盖dead方法,如果发现他覆盖了,就要通过 IDE 发出提醒。...本文说到的是如何提醒开发者不要覆盖方法。我们也可以通过自定义一个装饰器,来实现真正禁止其他人覆盖方法。发现覆盖就报错。如果大家有兴趣,请在本文下面留言,我们下一篇文章就写。 END

    95330

    静态方法可以重写吗?

    重写(Override)作为Java的特性之一,经常被作为面试问题。 比较坑的一个问题是,子类能否重写的静态方法? 答案当然是可以的。...但是重写之后会发生什么,是否调用子类静态方法会执行子类的逻辑,这才是坑所在的地方。 重写 回顾一下Override的定义,重写是对允许访问的方法的实现逻辑进行重新编写。...,执行的还是的逻辑。...这也就证明了,静态方法是在编译时使用了编译信息,进行静态绑定的。它和对象无关,而和有关。 总结 对于静态方法,我们不应该尝试去重写,而且调用时应该以进行调用,而不是对象进行调用。...我们经常会用来声明一个对象,而对象是在运行时才确定的,这就是运行时重写的意义所在。而对于静态方法的调用,虽然Java允许通过对象来调用,但只是为了开发方便,正确的姿势是通过来调用。

    1.5K20

    Java强制转换子类原则

    最近,微信群友在讨论子类的转换问题,其实不难,给大家用实例来说明一下就很明了了。 我们知道Java中子类转换成是没有任何问题的,那可以转换成子类吗?...Fruit fruit1 = new Fruit(); Apple apple1 = new Apple(); apple1 = (Apple) fruit1; // java.lang.ClassCastException...} static class Fruit { } static class Apple extends Fruit { } } 结果是: test1:报转异常...所以,想让强制转换成子类,不是没有可能,除非是子类构造出来的实例,不然是不能强转的。 为什么呢?...如上代码,如果实例出来的对象是Orange,Orange当然不能强制转成Apple,所以说只有该子类对应的实例才能强转。

    2.3K80

    Java】基础21:顶层Object

    今天要学的ObjectJava里面,就好比是和亚当夏娃一样的存在。 只不过神话终归只是神话,是虚无缥缈的,但是计算机里面,Object是真真实实存在的。...②getSuperClass():得到名。 ③Class是指java.lang这是Java里面的一个包,名是Object。 所以数组的也就是Object.。...如果一个没有特别指定,那么默认继承自Object。 既然Object是顶层,那么按照继承的规则:子类可以调用方法。 Object中的方法,所有都可以使用。...②在测试main方法中,创建对应的person对象并初始化。 ③调用toString()方法并打印(注意:Person中并没有定义toString()方法,它调用的是Object的方法)。...下图为String的toString()方法 String是Object,它将的toString方法重写了。

    75220

    java引用指向子类对象好处_java子类调用类属性

    2.多态的体现 1 接口 和 实现接口并覆盖接口中同一方法的几不同的体现的 2 和 继承覆盖中同一方法的几个不同子类实现的....子类覆盖实现多态: 如果子类继承的超是一个抽象,虽然抽象不能通过new操作符实例化,但是可以创建抽象的对象引用指向子类对象,以实现运行时多态性,不过,抽象的子类必须覆盖实现超中的所有的抽象方法...,将会调用子类中 的这个方法;(动态连接、动态调用) 四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了 中的变量,那么在编译时会报错。...所以可以实现强转… 4.static 顾名思义,就是静态的,他是方法的,他属于这个,由于是方法,他可以直接引用名来引用方法,也可以通过的对象来引用这个方法,他既不能被子类覆盖,也不能被子类继承...对子类与的static问题 ——没覆盖也没继承,子类存有指向的引用 对于private ——该方法或属性只能在该类内使用 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人

    1.2K20

    子类继承,重写的synchronized方法,两个synchronized方法的锁对象的问题

    参考链接: 用子类引用子类对象 vs 引用 这是java并发编程实践中有关重入概念的介绍时产生的问题  public class Widget {       public synchronized...System.out.println(toString() + ": calling doSomething");           super.doSomething();       }   }  子类继承...,重写的synchronized方法,两个synchronized方法的锁对象的问题  是同一个锁还是不同锁呢,是同一个锁的话是  对象作为锁还是子类对象作为锁呢? ...synchronized void doSomethingElse() {       System.out.println("something else");     }   } } 如果不是同一个锁,super锁住了对象...,至于理解么:  可以认为即便是继承创建了对象,并把对象的引用交给了子类,但是在super.去调用方法的时候JVM认为调用者依然是子类。

    1.8K20
    领券