首页
学习
活动
专区
工具
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

    Python继承(调用成员与方法

    python中的初始化方法是__init__(),因此子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用的初始化函数,如果子类实现这个函数,就覆盖的这个函数,既然继承,就要在这个函数里显式调用一下的...调用函数有以下方法: Python class Animal():     def __init__(self, name):         self.name = name       def...).parent_attribute(arg) 【不需要写self】 3.在定义中调用本类的方法,可以直接 super().parent_method(arg) 【个人推崇这种写法】 样例如下:...        print ("I am "+ self.name + ", and I can bark")       def animal_say_1(self):         # 子类调用方法...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允许通过对象来调用,但只是为了开发方便,正确的姿势是通过来调用。

    1.5K20

    子类继承,重写的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

    Python_子类调用方法

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

    4.8K20

    python调用方法的三种方式(super调用和名调用)

    子类调用方法的三种方式:名.方法名(self)super(子类名,self).方法名()super().方法名注意:super()通过子类调用当前方法,super默认会调用第一个方法...display()方法中,需要用到food属性的值,#但由于People的构造方法覆盖了Animal的构造方法,使得在创建xiaobai对象时,Animal的构造方法未得到执行,所以程序出错。...针对这种情况,正确的做法是定义Person自己的构造方法(等同于重写第一个直接的构造方法),但是需要注意的是,在子类中定义构造方法,则必须在该方法中调用的构造方法。...也就是说,涉及到多继承时,在子类构造函数中,调用第一个构造方法的方式有以上两种,而调用其他构造方法的方式只能使用未绑定方法。...__init__(self, name)使用未绑定方法调用第一个的构造方法 #调用其他的构造方法,需要手动给self传值 Animal.

    1.1K20

    子类继承,的初始化

    从外部看,似乎新拥有与基础相同的接口,而且可包含一些额外的方法和字段。但继承并非仅仅简单地复制基础的接口了事。创建衍生的一个对象时,它在其中包含了基础的一个“子对象”。...这个子对象就象我们根据基础本身创建了它的一个对象。从外部看,基础的子对象已封装到衍生的对象里了。...当然,基础子对象应该正确地初始化,而且只有一种方法能保证这一点:在构建器中执行初始化,通过调用基础构建器,后者有足够的能力和权限来执行对基础的初始化。...个人总结: super关键字必须写在构造方法方法体内的非注释代码的首行 子类进行初始化,必须调用的构造方法,如果的所有构造方法都用private修饰了的话,则无法继承,编译报错....衍生构造方法调用的构造方法,如果是无参构造方法,那么编译器会为衍生的构造方法首行加上super()。 编译器会强迫我们在衍生构建器的主体中首先设置对基础构建器的调用。

    1.9K30
    领券