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

Python:子类中__slots__的继承实际上如何工作?

在Python中,__slots__是一个特殊的类属性,用于限制类的实例可以添加的属性。当一个类定义了__slots__属性时,Python会限制该类的实例只能添加__slots__中定义的属性。这可以减少内存消耗,并提高代码的可读性和可维护性。

在子类中,__slots__的继承实际上是通过以下方式工作的:

  1. 当子类没有定义__slots__属性时,子类将继承父类的__slots__属性。这意味着子类的实例将具有与父类相同的__slots__属性。
  2. 当子类定义了__slots__属性时,子类的实例将具有子类中定义的__slots__属性。这意味着子类的实例将不会继承父类的__slots__属性。
  3. 如果子类的__slots__属性包含父类的__slots__属性,那么子类的实例将同时具有子类和父类的__slots__属性。
  4. 如果子类的__slots__属性不包含父类的__slots__属性,那么子类的实例将只具有子类的__slots__属性。

以下是一个示例:

代码语言:python
代码运行次数:0
复制
class Parent:
    __slots__ = ('a', 'b')

class Child(Parent):
    __slots__ = ('c',)

class Child2(Parent):
    __slots__ = ('a', 'c')

class Child3(Parent):
    pass

p = Parent()
c = Child()
c2 = Child2()
c3 = Child3()

p.a = 1
p.b = 2
# p.c = 3  # AttributeError: 'Parent' object has no attribute 'c'

c.a = 1
c.b = 2
c.c = 3

c2.a = 1
c2.c = 3
# c2.b = 2  # AttributeError: 'Child2' object has no attribute 'b'

c3.a = 1
c3.b = 2
# c3.c = 3  # AttributeError: 'Child3' object has no attribute 'c'

在这个示例中,Parent类定义了__slots__属性,其中包含ab属性。Child类继承了Parent类,并定义了一个新的__slots__属性,其中包含c属性。Child2类也继承了Parent类,并定义了一个新的__slots__属性,其中包含ac属性。Child3类继承了Parent类,但没有定义__slots__属性。

在示例中,可以看到子类实例的行为如下:

  • Child类实例可以访问abc属性。
  • Child2类实例可以访问ac属性,但不能访问b属性。
  • Child3类实例可以访问ab属性,但不能访问c属性。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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(不管参数列表是否相同),则按继承顺序,选择第一个父类方法。

3.1K30

Hadoop如何正确编写继承自Writable接口子类

Hadoop可以编写自己类,用作hadoop jobkey或者value类型,自己编写类要实现接口Writable。...我编写了一个HttpContent类,主要用于保存爬取网页源码,返回状态和编码格式信息,他在mapper别实例化保存网页内容,然后传输到reducer中被使用,在编写遇到了一些问题: (1)首先是没有编写默认构造函数类...,因为java反馈机制需要一个参数为空默认构造函数,如果没有这个类就不能利用反馈机制实例化这个类。...(2)然后是类型在序列化时候写入后读取值不正确,一定要统一类型write(DataOutput out)和readFields(DataInput in)写入和读取参数方法,例如一个int类型如果你在...多个值写出读入时候,写出读入顺序要保持一致,否则读取也是不正确

78120
  • Python 继承子类示例:从 Person 到 Student 演示

    继承允许我们定义一个类,该类继承另一个类所有方法和属性。父类是被继承类,也叫做基类。子类是从另一个类继承类,也叫做派生类。...要创建一个从另一个类继承功能类,创建子类时将父类作为参数传递: 示例,创建一个名为 Student 类,它将继承 Person 类属性和方法: class Student(Person):...注意: 子类 init() 函数会覆盖父类 init() 函数继承。...__init__(self, fname, lname) 现在,我们已成功添加了 init() 函数,并保留了父类继承,并准备在 init() 函数添加功能。...使用 super() 函数 Python 还具有 super() 函数,可以使子类继承其父类所有方法和属性: 示例: class Student(Person): def __init__(self

    23510

    Python继承

    python3x版本只有一种类: python3使⽤都是新式类. 如果基类谁都不继承....在子类 重写 父类方法 在需要位置使用 super().父类方法 来调用父类方法执行 代码其他位置针对子类需求,编写 子类特有的代码实现 关于 super 在 Python super...顺序不能乱, 在python实现继承非常 简单. 在声明类时候, 在类名后⾯添加⼀个⼩括号,就可以完成继承关系. 那么什么情况可以使⽤继 承呢? 单纯从代码层⾯上来看....猫继承动物. 动物能动. 猫也能动. 这时猫在创建时候就有了动物"动"这个属性. 再比如, ⽩骨 精是⼀个妖怪. 妖怪天⽣就有⼀个比较不好功能叫"吃⼈", ⽩骨精⼀出⽣就知道如何"吃⼈"....此时 ⽩骨精继承妖怪. 多态: 同⼀个对象, 多种形态. 这个在python其实是很不容易说明⽩. 因为我们⼀直在⽤. 只是没 有具体说. 比如.

    71230

    Python __slots__ 简介

    简介 Python 中一切皆为对象,类也是如此,类变量具有强大动态灵活性,这依赖于变量实现了类似字典管理机制。但当我们需要限制实例属性时该如何实现?...提升成员访问性能 __slots__ 变量设置了类访问成员活动范围,舍弃了原始Python灵活性,但是收益是类成员访问效率提升。 python文档这样介绍它 3.3.2.4....准确说,__slots__不会被继承。当我们用一个不带有__slots__子类继承带有__slots__父类时。子类还是会生成__dict__ 和 __weakref__。...: image.png 继承结果 父类有 __slot__ 父类无 __slot__ 子类有 __slot__ 子类实际范围为父子__slots__ 并集 子类实际范围为子类本身...(也就是我们期望继承时),子类被约束在父类规则之下,无法创建新成员,其他情况不受影响,也就达到了我们需要继承父类__slots__目的 约束范围 需要注意一点,__slots__是类对实例属性约束

    50430

    Python继承

    继承: 面向对象程序语言一个重要特点是继承继承提供了在已存在类基础上创建新类方法。继承子类 拥有被继承父类所有方法,在此基础上,子类还可以添加自己专有方法。继承是类强有力特点。...有时,继承反映了问题自然结构,这样使程序更容易理解。任何事情都有双重性。继承也有可能使程序变得难以阅读。调用一个方法时,有时很难判断它是在哪定义。相关代码可能分散在几个模块。...如果要引用子类某个属性,首先在子类寻找,没有就去到父类寻找它定义,在没有的话,就一直向上找下去,知道找到为止。 方法寻找方式与属性相同。...子类方法可以重定义父类方法,要是你觉得父类方法不能满足要求的话。有时候,子类方法可以直接调用父类方法,方式如下: BaseClass.method(self,arguments) 1....在Python ,类私有方法和私有属性,不能够从类外面调用。类方法和属性是公有,还是私有,可以从它名字判断。如果名字是以两个下划线开始,但并不是以两个下划线结束,则是私有的。

    73220

    【C++】继承 ⑩ ( 继承机制 static 静态成员 | 子类访问父类静态成员方法 )

    一、继承机制中派生类 static 关键字 1、子类继承父类静态成员 子类继承父类静态成员 : 父类 ( 基类 ) 使用 static 关键字 定义 静态成员变量 , 可以被所有的 子类 (...派生类 ) 共享 ; 2、父类静态成员访问控制权限改变 继承自 父类 静态成员变量 , 仍然遵循 继承 子类 访问控制特性 , public 公有继承 : 父类成员 在 子类 , 访问控制权限...成员 ; 父类 private 成员 仍然是 private 成员 ; protected 保护继承 : 父类成员 在 子类 , 访问控制权限 变为 protected , 基类 公有成员...成员 ; 父类 private 成员 仍然是 private 成员 ; private 私有继承 : 父类成员 在 子类 , 所有成员访问控制权限 变为 private , 基类 所有成员...成员 仍然是 private 成员 ; 3、子类如何访问父类静态成员 子类 使用 父类类名 :: 静态成员名 Parent::c = 20; 或 子类类名 :: 静态成员名 Child::c = 40

    41610

    python __slots__属性详解

    Python是动态语言,对于普通类,可以为类实例赋值任何属性,这些属性会存储在__dict__: class Persion(object): pass p=Persion() p.name...__dict__) 结果展示 {'name': 'leizi'} 这样特性带来两个问题: 数据通过字典(Hash)存储所占用空间较大 如何禁止随意生成类属性 当然,__slots__就能解决这两个问题...__变量后,Student类实例已经不能随意创建不在__slots__定义内属性phone,同时实例也不再有__dict__结构。...使用: __slots__继承中有两种表现: 子类未声明__slots__时,不继承父类__slots__,即此时子类实例可以随意赋值属性 子类声明__slots__时,继承父类__slots_...__dict__) 结果: 子类没有继承,这样就是没有继承父类,可以随意赋值。

    18930

    Python学习 Day 8 继承 多态 Type isinstance dir __slots__

    继承和多态 在OOP程序设计,当我们定义一个class时候,可以从某个现有的class继承,新class称为子类(Subclass),而被继承class称为基类、父类或超类(Base class...在Python,如果你调用len()函数试图获取一个对象长度,实际上,在len()函数内部,它自动去调用该对象__len__()方法,所以,下面的代码是等价: >>> len('ABC') 3...,Python允许在定义class时候,定义一个特殊__slots__变量,来限制该class能添加属性: >>> class Student(object): __slots__...使用__slots__要注意,__slots__定义属性仅对当前类起作用,对继承子类是不起作用: >>> class GraduateStudent(Student): ....... >>> g = GraduateStudent() >>> g.score = 9999 除非在子类也定义__slots__,这样,子类允许定义属性就是自身__slots__加上父类__slots

    88730

    Python继承、多层继承和多继承

    Python,一个类可以通过继承方式来获得父类非私有属性和非私有方法。...2.子类可以实现父类没有的属性和方法,与继承属性和方法互不干扰。 3.如果在子类中有跟父类同名方法,但方法执行内容不同,则子类可以重写父类方法。...当子类实现一个和父类同名方法时,叫做重写父类方法。直接在子类定义与父类同名方法,然后在方法实现子类业务逻辑,子类方法就会覆盖父类同名方法。...4.如果在子类重写父类方法,需要使用父类同名方法功能,在父类功能基础上做扩展,则子类可以在重写方法调用父类被重写方法,使用super()来调用。 ? 二、类多层继承 类可以多层继承。...同一个类可以继承多个类,如上面的HuaWei类同时继承了Phone和Computer两个类。这时,两个父类方法和属性子类都可以使用,两个父类父类属性和方法也可以使用。

    5.3K30

    java之父类构造器是否能被子类继承

    子类默认继承父类属性和方法,但不会继承父类构造器,而是在子类被实例化时会默认调用父类空构造器。子类在创建时候会调用自己空构造器,并在空构造器会隐式调用super(),即父类空构造器。...如果父类构造器被重载,那么子类构造器也必须初始化父类构造器,否则会报编译错误。当然,只要父类显示定义了空构造器,子类中就不必初始化父类构造器。...return this.age; } public Person(String name) { this.name = name; } } 子类...System.out.println(personName); System.out.println(studentName); } 输出: tom jack 说明:此时父类没有显示定义空构造器...,只有一个重载了构造器,在子类构造器,必须初始化父类构造器,即super关键字+父类构造器参数。

    1.2K20

    python继承

    python和C++一样,支持多继承。概念虽然容易,但是困难工作是如果子类调用一个自身没有定义属性,它是按照何种顺序去到父类寻找呢,尤其是众多父类中有多个都包含该同名属性。...d先查找自身是否有foo方法,没有则查找最近父类C1里是否有该方法,如果没有则继续向上查找,直到在P1找到该方法,查找结束。...2、新式类 使用新式类要去掉第一段代码注释 d=D() d.foo() # 输出 p1-foo d.bar() # 输出 c2-bar  实例d调用foo()时,搜索顺序是 D => C1 => C2...=> P1 实例d调用bar()时,搜索顺序是 D => C1 => C2 可以看出,新式类搜索方式是采用“广度优先”方式去查找属性。...可以调用类__mro__属性来查看查找顺序

    67600

    浅谈Python继承

    继承 Python 中所有的类都是object类子类,而object 继承自type 继承分为 接口继承和实现继承 接口继承:使用父类接口名,子类重写这个方法。...尽可能继承接口类,在子类实现方法,鼓励对接口类继承,这样遵循接口隔离原则,有利于归一化设计,不提倡对抽象类进行多继承 实现继承子类不需要实现任何东西,直接使用父类接口和实现会增强代码耦合性,...但是使用属性还是自己。 print('*'*40) person1.get_name() person2.get_name() # 方法接口继承,在子类重写了这个方法。...为了解决多继承,初始化方法被重复调用问题。...继承详细内容,更多关于Python 继承资料请关注ZaLou.Cn其它相关文章!

    60920

    如何通过一些骚操作有效控制Python

    平时工作,能用到类基本都是可变,无论是实例属性,还是类属性,也正是因为这样,所以python也是一个“鸭子类型”编程语言。...那么这个时候,如果这个类是个关键类,或者只是个只读类,如何才能组织这些动态,不受控制添加呢? >>> class B: ......2个: __slots__ 方法,在类,使用__slots__方法可以控制类属性和方法,在定义完类后,我对b....但是大家一定要注意,使用__slots__是有风险,由于强制限制了__dict__使用,那么你要添加任何方法和属性时候就得重写这个类了,并且继承B类子类,也需要重写__slots__方法。...__setattr__方法,我们在__init__这个构造函数,添加了这个方法,目的是为了设置一个在__slots__存在属性值,而在__setattr__函数,我们重写了他,致使对任意类和实例属性进行修改时候

    54440

    Python面向对象:杂七杂八知识点

    __dict__.keys()) 输出结果: ['a', 'b', '__dict__'] dict_keys(['c', 'd']) 因为子类不会继承父类__slots__,所以如果父类没有定义_..._slots__的话,因为子类可以访问父类__dict__,这会使得子类自身定义__slots__属性限定功能失效。...__dict__.keys()) 结果: ['a', 'b'] dict_keys(['ddd']) 多重继承和__mro__和super() python支持多重继承,只需将需要继承父类放进子类定义括号即可...但在Python,使用多重继承情况也非常多,如果真的要使用多重继承,一定要设计好类。一种更好方式是使用Mixin类,见下文。...先说明在Python如何定义抽象类。Pythonabc模块(Abstract Base Classes)专门用来实现抽象类、接口。

    93021
    领券