Meta 继承 创建抽象基类的时候,Django 会将你在基类中所声明的有效的 Meta 内嵌类做为一个属性。如果子类没有声明它自己的 Meta 内嵌类,它就会继承父类的 Meta 。...这意味着抽象基类的子类不会自动变成抽象类。当然,你可以让一个抽象类继承另一个抽象基类,不过每次都要显式地设置 abstract=True 。...但在抽象基类上这样做就会引发一个很严重的问题。因为 Django 会将基类字段添加到每个子类当中,而每个子类的字段属性值都完全相同 (这里面就包括 related_name)。...基类的限制 代理 model 必须继承自一个非抽象基类。你不能继承自多个非抽象基类,这是因为一个代理 model 不能连接不同的数据表。...代理 model 也可以继承任意多个抽象基类,但前提是它们没有定义任何 model 字段。 代理 model 从非抽象基类中继承那些未在代理 model 定义的 Meta 选项。
最后,如果你只是想改变模块Python 级别的行为,而不用修改模型的字段,你可以使用代理模型。 抽象基类 当你想将一些常见信息存储到很多model的时候,抽象化类是十分有用的。...这意味着抽象基类的子类不会自动变成抽象类。 当然,你可以让一个抽象类继承另一个抽象基类,不过每次都要显式地设置 abstract=True。...但在抽象基类上这样做就会引发一个很严重的问题。因为 Django 会将基类字段添加到每个子类当中,而每个子类的字段属性值都完全相同 (这里面就包括related_name)。...基类的限制 代理 模型必须继承自一个非抽象基类。 你不能继承自多个非抽象基类,这是因为一个代理 model 不能连接不同的数据表。...代理 model 也可以继承任意多个抽象基类,但前提是它们没有 定义任何 model 字段。 代理模型的管理器 如果你没有在代理 模型中定义任何 管理器 ,代理模型就会从父类中继承 管理器 。
常见情况下,你仅将父类用于子类公共信息的载体,因为你不会想在每个子类中把这些代码都敲一遍。这样的父类永远都不会单独使用,所以 抽象基类 是你需要的。...从抽象基类继承来的字段可被其它字段或值重写,或用 None 删除。 对很多用户来说,这种继承可能就是你想要的。它提供了一种在 Python 级抽出公共信息的方法,但仍会在子类模型中创建数据表。...这意味着抽象基类的子类不会自动地变成抽象类。为了继承一个抽象基类创建另一个抽象基类,你需要在子类上显式地设置 abstract=True。 抽象基类的某些 Meta 属性对子类是没用的。...'%(class)s' 用使用了该字段的子类的小写类名替换。 '%(app_label)s' 用小写的包含子类的应用名替换。每个安装的应用名必须是唯一的,应用内的每个模型类名也必须是唯一的。...不存在什么方法能在你创建完代理后,帮你替换所有 Person (或其它)模型。 基类约束¶ 一个代理模型必须继承自一个非抽象模型类。
类和实例命名空间混淆。如果你在一个继承自一个或多个基类的类中有一个属性 self.x,那么你就需要研究并耗费脑力来找出 x 的来源。阅读代码时如此,调试时也如此。...请注意,不是每个抽象基类都是抽象数据类型。有时它只是一个不完整的类,你应该通过继承它并实现其抽象方法来完成它——而不是一个接口。不过,这种区别并不总是百分百清晰的。...---- 使用 ABC 定义接口的一个「好处」是,通过继承它们,你可以在抽象基类中添加普通的方法来偷渡到代码共享。但正如一开始提到的:混合子类类型是个坏主意。...和所有类型的继承一样,代码可读性会受到影响,因为你必须在头脑中组装出最终的类,才能知道存在哪些字段。但实际上你得到的是与第一种方法相同的类。...这意味着基类提供了一个整体的控制流程,而子类则填补了一些细节: 用户实例化一个子类, 然后调用基类上的方法, 其中又调用了子类中的方法。
还是直接作为实例,拥有自己的数据表?以下是三种最常用的类继承模式: 通常情况下,我们只想使用父类来保存一些你不想在每个子类中都敲一遍的通用信息。该类不会真正对数据库操作,也就是所谓的抽象基类。...最后,如果你只是想要修改Python语言级别的model行为而不修改models的字段,你可以使用Proxy models。 抽象基类 抽象基类在你想要在你的模型中加入一些信息的时候很有用。...Meta继承 当一个抽象基类被创建的时候,Django会声明一些Meta 内部类,若子类没有声明它自己的Meta类,它就会继承父Meta。...如果子类想要拓展父Meta类,需要先继承,再拓展: Django对于抽象基类Meta类做了调整:在使用Meta属性的时候,会设置abstract=False 。...这意味着抽象基类的子类不会自动变成抽象类,除非你自己手动将其设置为True,让其成为抽象类。
你不可能总是使用纯粹的接口。 1 抽象类 创建通用接口的唯一理由是,不同的子类可以用不同的方式表示此接口。通用接口建立了一个基本形式,以此表达所有派生类的共同部分。...Java 在设计之初,C++ 的多继承机制饱受诟病。Java 过去是一种严格要求单继承的语言:只能继承自一个类(或抽象类),但可以实现任意多个接口。...子类并不要求必须继承自abstract的或“具体的”(没有任何抽象方法)的父类。如果继承一个非接口类,那么只能继承一个类,其余的基元素必须都是接口。...这带来了一个问题:应该使用接口还是抽象类呢? 如果创建不带任何方法定义或成员变量的基类,就选择接口而不是抽象类。事实上,如果知道某事物是一个基类,可以考虑用接口实现它。...因为字段是 static 的,所以它们在类第一次被加载时初始化,这发生在任何字段首次被访问时。 这些字段不是接口的一部分,它们的值被存储在接口的静态存储区域中。
毕竟你不可能总是使用纯粹的接口。 1 抽象类 创建通用接口的唯一理由是,不同的子类可以用不同的方式表示此接口。通用接口建立了一个基本形式,以此表达所有派生类的共同部分。...Java 在设计之初,C++ 的多继承机制饱受诟病。Java 过去是一种严格要求单继承的语言:只能继承自一个类(或抽象类),但可以实现任意多个接口。...子类并不要求必须继承自abstract的或“具体的”(没有任何抽象方法)的父类。如果继承一个非接口类,那么只能继承一个类,其余的基元素必须都是接口。...这带来了一个问题:应该使用接口还是抽象类呢? 如果创建不带任何方法定义或成员变量的基类,就选择接口而不是抽象类。事实上,如果知道某事物是一个基类,可以考虑用接口实现它。...因为字段是 static 的,所以它们在类第一次被加载时初始化,这发生在任何字段首次被访问时。 这些字段不是接口的一部分,它们的值被存储在接口的静态存储区域中。
在继承中new和override相同点和区别?看下面的代码,有一个基类A,B1和B2都继承自A,并且使用不同的方式改变了父类方法Print()的行为。测试代码输出什么?为什么?...,上面的代码中,定义两个简单的类,一个基类A,,B1和B2继承自A,然后使用不同的方式改变了父类方法的行为。...继承是可传递的,子类是对父类的扩展,必须继承父类方法,同时可以添加新方法。 子类可以调用父类方法和字段,而父类不能调用子类方法和字段。 ...基本上是的,所有值类型和引用类型都继承自System.Object,接口是一个特殊的类型,不继承自System.Object。 2....重载:当类包含两个名称相同但签名不同(方法名相同,参数列表不相同)的方法时发生方法重载。用方法重载来提供在语义上完成相同而功能不同的方法。
答:尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现...答:结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。 ...实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。 结构不能从类或其他结构继承。 ...同:接口、类和结构可从多个接口继承。 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。 接口可以包含事件、索引器、方法和属性。...35.接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
看下面的代码,有一个基类A,B1和B2都继承自A,并且使用不同的方式改变了父类方法Print()的行为。测试代码输出什么?为什么?...,上面的代码中,定义两个简单的类,一个基类A,,B1和B2继承自A,然后使用不同的方式改变了父类方法的行为。...继承是可传递的,子类是对父类的扩展,必须继承父类方法,同时可以添加新方法。 子类可以调用父类方法和字段,而父类不能调用子类方法和字段。 ...基本上是的,所有值类型和引用类型都继承自System.Object,接口是一个特殊的类型,不继承自System.Object。 2....重载:当类包含两个名称相同但签名不同(方法名相同,参数列表不相同)的方法时发生方法重载。用方法重载来提供在语义上完成相同而功能不同的方法。
通常一个模型类包括数据的属性,可能还会有不同的标签(有些是为了显示给用户时更友好),并且可以设置一些规则进行验证。模型中的数据可能来自数据库的表或一个表单用户输入域。...Yii 实现了两种模型:表单模型(CFormModel 类)和 Active Record 模型(CActiveRecord 类)。他们都继承自同一个基类 CModel。...CFormModel 代表的数据模型是从 HTML 表单中收集的输入,它封装了所有逻辑,如表单的验证和其他业务逻辑,这些是要应用到表单的域上。...在 Yii 中,每一个 AR 对象的实例可以是 CActiveRecord 类或它的子类,它包装了数据库表或视图中的一行记录,并封装了所有逻辑和访问数据库的细节,如果有大部份的业务逻辑,则必须使用这种模型...数据库表中一行每列字段的值对应 AR 对象的一个属性。
重载和重写的区别: 重载:方法名相同参数个数和参数类型不同 重写:当子类继承父类,子类中的方法与父类中的方法名,参数类型和参数个数完全相同则称为子类重写了父类方法(需要一override字标示)(对基类成员的...而抽象类中可以有方法的实现,也可以定义非静态的类变量。 抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。 抽象类可以提供某些方法的部分实现,接口不可以.抽象类的实例是它的子类给出的。...,定义里可不加virtual关键字,但函数声明要和基类的完全一致!...如何在C#中实现继承? 在类名后加上一个冒号,再加上基类的名称。 私有成员会被继承么? 会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。...运算符(创建对象,创建值类型的默认构造函数) 修饰作用(隐藏基类中的继承对象,子类中的对象覆盖基类中的版本) string是值类型还是引用类型?
通常情况下,最好将索引数据存储在另一个位置,而不是类实例本身。 类继承 和其它面向对象语言一样,JavaScript 中的类可以继承自基类。...常见的错误是认为 implements 子句会改变类的类型 —— 实际上是不会的!...extends 子句 类可以继承自某个基类。派生类拥有基类的所有属性和方法,同时也可以定义额外的成员。...因此,在进行诸如单元测试这样的操作时,访问私有字段会比较容易,但缺点就是这些字段是“弱私有的”,无法保证严格意义上的私有性。...抽象方法或者抽象字段在类中没有对应的实现。这些成员必须存在于一个无法直接被实例化的抽象类中。 抽象类的角色是充当一个基类,让其子类去实现所有的抽象成员。
4) 结构中不能有实例字段初始值设定,但类没有任何限制。 5) 类的构造函数里面可以不用对所有字段进行初始化;结构的构造函数里面必须对所有字段进行初始化。... protected internal :内部受保护的,同一个程序集里面的任何位置,或者不同程序集中的派生类可以访问。 备注: 父类=基类 子类=派生类 面向对象的三大特征是什么?...不同点: ----单继承,多接口 抽象类也是类,具有类的共同特点:单基类继承,多接口实现;接口不是类,只能继承多个接口。...方法的override和overload有什么区别? 重写(override):子类对基类中的虚成员(虚方法、虚属性等)或抽象成员(抽象方法、抽象属性等)进行覆盖,重新实现。...ASP.NET中所有自定义用户控件都必须继承自哪一个类?页面必须继承哪一个类? 用户控件基类:System.Web.UI.UserControl。
最常见的生成这 4 条指令的场景是:使用 new 关键字实例化对象的时候;读取或设置一个类的静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)的时候;以及调用一个类的静态方法的时候...除此之外,所有引用类的方式都不会触发初始化,称为被动引用。被动引用的常见例子包括: 通过子类引用父类的静态字段,不会导致子类初始化。...该过程会对数组类进行初始化,数组类是一个由虚拟机自动生成的、直接继承自 Object 的子类,其中包含了数组的属性和方法。...,这些类由 Java 实现,独立于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。...FileSystemClassLoader 是自定义类加载器,继承自 java.lang.ClassLoader,用于加载文件系统上的类。
元数据验证: 对字节码描述信息进行语义分析,保证其描述的信息符合Java语言规范: 这个类是否有父类; 这个类的父类是否继承了不被允许继承的类(final类); 如果这个类不是抽象类,是否实现了其父类和接口中要求的所有方法...符号引用验证: 最后一个阶段发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作在解析阶段发生。符号引用验证可以看作是对类自身以外(常量池中的各种符号引用)的信息进行匹配性校验。...其他类加载器:由Java语言实现,继承自抽象类ClassLoader。...这里的父子关系一般使用组合实现而不是继承。 ? 双亲委派模型的工作模式是:如果一个类加载器收到了类加载请求,它首先不会自己去加载这个类,而是把这个请求委派给自己的父类来完成。...因此所有的类加载请求都会传递到顶层的启动类加载器中。只有在父类加载器无法加载时,才会由子类加载器加载。 双亲委派模型的好处是所有类加载器都有了一种层次关系。
如果我们有一个继承自“Car“的“Passenger Car”, 或者有一个“SUV”类也继承自“Car“,如果我们把“Car”类替换成“SUV”类或者“Passenger Car”类,即把父类Car替换成任何一个子类后...虽然两者不一样,但是这个原则可以应用到JS类上。 对于JS类来说,这个原则是指当我们创建一个基础类,需要在其中定义所有子类都会用到的方法,并且避免只有部分子类会用到的方法。...其他两个类也是使用同样的处理方式,Car重写了fly和sail,ship重写了fly。 所以问题在于:我们创建的基类包含的方法,有的子类可以使用,但其他的子类不能。...一个类在应用的其他地方已经开始使用,就不应该再修改它。 3、里氏替换原则(LSP):派生的子类应该是可替换基类的,也就是说任何基类可以出现的地方,都可以被子类替换。...值得注意的是,当通过继承实现多态行为时,如果派生类没有遵守LSP,可能会让系统引发异常。 4、接口隔离原则(ISP):基类不应该包含他们子类不使用的方法,也就是说一个接口应该拥有尽可能少的行为。
类装饰器也是函数,但设计用于检查、更改甚至替换装饰的类为另一个类。最后,元类是类元编程的最高级工具:它们让你创建具有特殊特性的全新类别的类,例如我们已经看到的抽象基类。...object和ABCMeta都是type的实例,但这里的关键关系是ABCMeta也是type的子类,因为ABCMeta是一个元类。 在这个图表中,Iterable是唯一的抽象类。...,继承自 type。...编写自己的PersistentABCMeta元类,作为abc.ABCMeta和PersistentMeta的子类,使用多重继承,并将其作为Record的唯一元类。...¹⁶ 如果您考虑到使用元类的多重继承的影响而感到头晕,那很好。我也会远离这个解决方案。 ¹⁷ 在决定研究 Django 的模型字段是如何实现之前,我靠写 Django 代码谋生几年。
抽象和接口的区别? 相同点: 都不能被实例化,接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。...不同点: 实现方式:实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。...代码题 用两个栈实现队列 十进制转二进制 交通银行 说一下主键和索引 主键是用于唯一标识数据库表中每一行数据的字段或字段组合。它具有以下特点: 主键必须是唯一的,每一行数据都必须具有唯一的主键值。...可以根据需要自由组合这些数字来设置文件或目录的权限。 解释一下c++的继承、封装、多态。 继承:C++中的继承允许一个类(派生类/子类)从另一个类(基类/父类)继承属性和方法。...派生类可以通过继承基类来扩展和重用代码。在C++中,派生类可以通过关键字"public"、"protected"或"private"来指定继承的方式和访问权限。
成员函数与继承派生类可以继承其基类的成员, 然而有时候派生类必须对其重新定义。派生类需要对这些操作提供自己的新定义以覆盖从基类继承而来的旧定义。...成员函数如果没被声明为虚函数,则其解析过程发生在编译时而非运行时。就会按照实际情况调用。 派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员。...此外,我们能将公有派生类型的对象绑定到基类的引用或指针上。 大多数类都只继承自一个类,这种形式的继承被称作“单继承”。 派生类中的虚函数派生类经常(但不总是)覆盖它继承的虚函数。...func() = 0; 抽象类无法实例化对象(堆区,栈区) 子类也必须要重写父类中的虚函数,否则子类也就是抽象类 具体代码示意如下所示 #include using namespace...void func() = 0; /* 抽象类无法实例化对象(堆区,栈区) 子类也必须要重写父类中的虚函数,否则子类也就是抽象类 */ virtual ~base()
领取专属 10元无门槛券
手把手带您无忧上云