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

Python之抽象基类建议收藏

大家好,又见面了,我是全栈君 抽象基类的核心定义abc模块中,模块中包括了创建抽象基类需要的修饰符和元类型 abc.ABCMeta 用来生成抽象基础类的元类。由它生成的类可以被直接继承。...>> (, ) 注册方式的缺点:不会出现在类的 MRO (Method Resolution Order),故而也不能通过...当没有实现抽象方法时,实例化时候不会报错,只有调用时候才会报错。 继承方法   直接从抽象基类派生子类有一个好处,除非子类实现抽象基类的抽象方法,否则子类不能实例化。...MRO (Method Resolution Order) nor will method implementations defined by the registering ABC be callable...usage as a class decorator. """ if not isinstance(subclass, type): raise TypeError

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

python的抽象基类

与jvm的语言不一样,python的语言没有interface关键字,而且除了抽象基类,每个类都有相应的接口:类实现或继承的公开属性(方法或数据类型) 定义里,受保护的属性和私有属性不在接口中:即便...chuancy\AppData\Local\Continuum\Anaconda3\lib\random.py",line 272,in shuffle x[i],x[j] = x[j],x[i] TypeError...“鸭子类型”:忽略对象的真正类型,转而关注对象有没有实现所需的方法,签名和语义。 继承抽象基类很简单,只要实现python里的特殊方法__len__之类的,这样python就会自动识别。...抽象基类的继承大多都是collections模块,现在打开这个模块的文档看看。..._collections_abc.py中 class Hashable(metaclass=ABCMeta): __slots__ = () @abstractmethod

86710

关于如何在Python中使用静态、类或抽

我们每次调用方法都要涉及(这里我理解是引用)类 来看Python打算为我们做些什么,就是它从Pizza类中绑定所有的方法到这个类的任何实例。...__self__.get_size True 明显可以看出,我们仍然保持对我们对象的引用,而且如果需要我们可以找到它 Python3中,类中的函数不再被认为是未绑定的方法(应该是作为函数存在...),如果需要,会作为一个函数绑定到对象,所以原理是一样的(和Python2),只是模型被简化了 >>> class Pizza(object): ......如果我们顶级模型中定义了mix_ingredients函数,继承自Pizza的类除了重写,否则无法改变mix_ingredients的功能 类方法 什么是类方法,类方法是方法不会被绑定到一个对象,而是被绑定到一个类中...如果我们使用@staticmethod代替,我们必须要在代码中硬编码Pizza(写死Pizza),这样从Pizza继承的类就不能使用了 class Pizza(object):

69630

python学习笔记:第19天 类的约束

): # 创建类的时候指定要使用ABCMeta元类 @abstractmethod def eat(self):...上面的结果告诉我们,必须要实现抽象类才能实例化这个对象,手动重写这个方法后就能正常使用了: from abc import ABCMeta, abstractmethod class Aminal(metaclass...(推荐) 二、异常处理: 异常:所谓异常就是程序在运行过程中出现的异常,这种是事先不能预知的,只有程序运行时才会出现,所以我们要编写异常处理的程序来应对。...胡辣汤') # 这个时候会执行自定义的处理方法 # 输入正确的数字(整数或者小数) 上面我们捕获到异常都是python自定义的异常(TypeError和Except等),一些特定的场景中可能python...内置的异常种类不能全部适用,所以我们需要抛出自定义的异常。

46410

流畅的 Python 第二版(GPT 重译)(十三)

特别是,import语句不仅仅是一个声明,¹¹,而且当模块进程中首次导入时,它实际运行模块的所有顶层代码。对同一模块的进一步导入将使用缓存,然后唯一的效果将是将导入的对象绑定到客户模块中的名称。...⑥ 新创建的类中注入一个方法。 ⑦ 像往常一样,__new__ 必须返回刚刚创建的对象—在这种情况下是新类。 ⑧ 元类定义 __repr__ 允许自定义类对象的 repr()。...) -> None: if not callable(constructor) or constructor is type(None): raise TypeError...例如,像这样的声明可能触发TypeError: class Record(abc.ABC, metaclass=PersistentMeta): pass 我们看到abc.ABC是abc.ABCMeta...⁷ 我认为callable应该适用于类型提示。截至 2021 年 5 月 6 日,这是一个未解决的问题。 ⁸ 如在“循环、哨兵和毒丸”中提到的,Ellipsis对象是一个方便且安全的哨兵值。

9910

python 学习-打开潘多拉的魔盒-元类(metaclass)学习

前言 Python 里面大家都比较熟悉了,通过 class 关键字创建一个类,这是通过硬编码来实现的。 那么如何动态创建一个类呢,如果给一批数据,让它动态生成一个类?...不要轻易去开启python的 黑魔法—元类(metaclass)学习,可能会有2个极端 打开之后,如果你能驾驭,会发现无所不能,真正掌握了面向对象的精髓,可以无所不能实现你想要的任何功能。...用一个图来表示对象(obj,或叫实例)、类(class)、元类(Metaclass)的关系。...,因为使用元类创建类时,该 __new__() 方法会自动被执行,用来修改新建的类。..._init_private_attributes() ModelMetaclass 元类相关源码 class ModelMetaclass(ABCMeta): @no_type_check #

19420

面向对象编程进阶

深度优先 新式类:广度优先 super()用法 抽象接口 import abc class Alert(object): '''报警基类''' __metaclass__ = abc.ABCMeta...其实不难理解,普通的方法,可以实例化后直接调用,并且方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了...eat方法中去掉self参数,但这也意味着,eat中不能通过self.调用实例中的其它变量了 class Dog(object): def __init__(self,name):.../属性方法.py", line 16, in d.eat() TypeError: 'NoneType' object is not callable 正常调用如下 d = Dog...注:此方法一般无须定义,因为Python是一门高级语言,程序员使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器进行垃圾回收时自动触发执行的

77620

python3--归一化设计,接口类和抽象类,接口隔离原则,多态

甚至常常是有害的,因为它使得子类与基类出现强耦合 继承的第二种含义非常重要,它又叫接口继承 接口继承实质是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象...”----这在程序设计,叫做归一化 归一化使得高层的外部调用者可以不加区分的处理所有接口兼容的对象集合 依赖倒置原则: 高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象...然后让子类去实现接口中的函数 这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象使用时,从用法上来说都一样。...抽象类 什么是抽象类 与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 为什么要有抽象类 如果说类是从一堆对象中抽取相同的内容而来的...从现实角度来看,抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法,这一点与接口类有点类似,但其实是不同的 python中实现抽象类 例 import

2.3K10

Python中如何基于接口编程

过了一段时间,公司自建了私有云,要求不能再使用七牛云了,要改成自己的云存储,于是你不得不重新写一个类: class OwnImageStore(object):     def upload_own(...上下游系统使用我们开发的功能时,只需要使用接口中声明的函数列表,这样当实现发生变化的时候,上游系统的代码基本不需要做改动,以此来降低耦合性,提高扩展性。...但是,实际,这种观点过于教条和僵化,导致了某种设计僵化,与诸如 Python 之类的语言的动态特性大相径庭。 特别是,通常需要以对象类的创建者无法预期的方式处理对象。...诸如 Python 这样的语言中,几乎可以通过外部代码反映并直接访问对象的任何方面,有很多不同的方法来测试对象是否符合特定的协议。例如,如果询问“此对象是否是可变序列容器?”...    def foo(self): pass A()  # raises TypeError class B(A):     pass B()  # raises TypeError class

1.1K10

Python3标准库之functools管理函数的工具详解

1.1 修饰符 functools模块提供的主要工具就是partial类,可以用来“包装”一个有默认参数的callable对象。得到的对象本身就是callable,可以把它看作是原来的函数。...1.1.3 其他callable partial适用于任何callable对象,而不只是独立的函数。...1.1.4 方法和函数 partial()返回一个可以直接使用的callable,partialmethod()返回的callable则可以用作对象的非绑定方法。...如果无法完成一个比较,这个方法应当返回NotImplemented,从而在另一个对象使用逆比较操作符尝试比较,如果仍无法比较,便会完全失败。...('ERROR: {}'.format(err)) 如果将一个不能散列的对象传入这个函数,则会产生一个TypeError

61620

Python之面向对象

例如,如果想编写现有对象的自定义版本,可以继承该对象 也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。..._A__N是可以访问到的,即这种操作并不是严格意义的限制外部访问,仅仅只是一种语法意义的变形 这种自动变形的特点: 1.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果。...c.perimeter) #同上 ''' 输出结果: 314.1592653589793 62.83185307179586 ''' 例二:圆的周长和面积 #注意:此时的特性area和perimeter不能被赋值...)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开 【private】 这种封装对谁都不公开 python并没有语法把它们三个内建到自己的...) print(f.name) # f.name=10 #抛出异常'TypeError: 10 must be str' del f.name #抛出异常'TypeError: Can not delete

797100
领券