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

Python面向对象基础

,有的方法使用类来调用 类方法:当一个方法,被classmethod装饰时, 第一个参数会变成类本身, 这样的方法叫类方法 当一个方法, 被staticmethod装饰的时候,不会自动传递第一个参数,...,并且被实例使用时,传入的第一个参数还是类 静态方法可以被类和实例使用,都不会传入第一个参数 类中的普通方法,因为没有传入self,因此只能被类使用,实例无法使用 各种方法根据首参来决定。...访问控制 双下划线 所有双下划线开始,非双下划线结尾的成员,都是私有成员 严格的说, Python里没有真正私有成员 Python的私有成员是通过改名实现的:_类名 + 带双下划綫的属性 除非真的有必要...__status = 'hahaha' # 给对象创建了新的属性,并没有修改到__status In [6]: door...., 子类的成员会覆盖父类的同名成员 当父类含有一个带参数的初始化方法的时候,子类一定需要一个初始化方法,并且在初始化方法中调用父类的初始化方法 super方法:super(type, obj) =》type

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

    Python 类与继承

    ,Python 解释器会首先调用 __new__ 方法为对象分配空间,并返回对象的引用,Python 解释器在获得对象的引用后,将引用作为第一个参数,传递给 __init__ __new__ 通常用于控制生成一个类实例的过程...() 用来调用父类(超类)的方法,若父类和超类中有同名方法,优先调用父类 Python2 用法:super(父类/超类名, self).函数名 Python3 用法:super().函数名 父类、子类、...http://c.biancheng.net/view/2374.html dir() 函数返回一个列表,列表的内容是该对象的所有属性,包括从父类继承的属性 class A: name = '.../events/all 二者都是访问属性的方法,不同的是所有通过实例访问属性都会触发 __getattribute__ 方法,而当访问的属性不存在时,会继续触发 __getattr__,也就是说 __getattribute...name:参数名 dufault:默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError object.

    72940

    定制类和黑魔法

    2.引子:使用点来访问属性本质上就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的是独立的)中的内容。     ...当新增属性并赋值后,属性就存在于__dict__中了,再调用时,依然会被拦截,但由于存在于__dict__中了,会将结果返回。以上黑魔法中的参数name就对应于对象或类中的属性。   ...需要注意的是,__setattr__会在给属性赋值时自动触发,所以在自定义的__setattr__方法中不能出现类似于self.key = value的形式的直接赋值操作,这样会陷入无限递归,应使用self...同样的还有__delattr__,删除属性时会自动触发,因此在自定义的__delattr__方法中,不能出现类似于del self.key形式的直接删除,这样也会陷入无限递归,要用self....,因为我们可以完全的去自定义子类,子类中可以增加父类没有的功能,对于继承了已有对象类型的子类,我们在操作__getitem__、__setitem__、delitem__属性时,必然会跟__dict__

    47310

    Python `__slots__` 进阶指南:不止于节省内存,从原理到实践

    __dict__ 的开销在 Python 中,普通类的实例属性都存储在 __dict__ 字典中。...,Python 会:在类级别创建一个固定的内存布局,类似 C 语言中的结构体不再为实例创建 __dict__ 和 __weakref__ 属性(除非显式添加到 __slots__ 中)将属性直接存储在预分配的固定大小的数组中...__dict__)} bytes") except AttributeError as e: print(f"Slots对象没有__dict__属性:{e}")if __name__...单个对象大小对比:普通对象: 48 bytes普通对象的__dict__: 104 bytes普通对象总大小: 152 bytesSlots对象: 64 bytesSlots对象没有__dict__属性...在设计数据密集型应用时,合理使用 __slots__ 可以同时获得性能和代码质量的提升。实际工作中,可以先写普通的类,当发现性能瓶颈或需要更严格的属性控制时,再考虑引入 __slots__。

    7500

    Some question about

    ' object has no attribute '__dict__' 问题起源 在 Python 中对于某些 object __dict__ 属性是只读的,比如对于 type object。...对于一般的实例对象,__dict__ 会返回一个保存包含所有实例属性的独立的 dict 实例对象,对 __getattribute__ 的调用首先会访问这个 dict,并获取相应的实例属性 (这个调用会在通过描述器协议访问...__dict__ 会按照同样顺序,但是很明显会跳过 x.__dict__['name'] 的访问。 因为 x.__dict__ 不能保存在 x.__dict__["__dict__"] 中,对于 x....这个特殊的 proxy 对象允许你,获取那些定义在 class 而不是 class 的基类中的的属性。...前两个描述器可能会因为定义了 __slots__ 而消失,没有 __dict__ and __weakref__ 属性,反而会有每一个定义在 __slots__ 的属性。

    68030

    Python内置(4)类相关的内置

    将 Python 对象想象成空间中的箱子, 变量、数组索引等被命名为指向这些对象的箭头。...对象本身不受分配或删除的影响,只有箭头受其影响。但是现在没有箭头指向第一个物体,让它活着是没有意义的。因此,Python的“垃圾收集器(gc)”丢掉了它。现在我们只剩下一个object。...dir and vars: 一切都是字典 你有没有想过Python如何存储对象,它们的变量及方法?我们知道所有对象都有自己的属性和方法,但是Python究竟如何跟踪它们呢?...'__doc__': None }) 如您所见,与对象相关的属性x和y存储在其对象自己的字典中,方法实际上作为函数存储在类的字典中。...这两种不同的存储数据方式,在Python中用__dict__和__slots__呈现。通常,实例属性(如self.foo)存储在__dict__字典中。

    2.4K30

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

    当通过实例对象去调用方法时,或者说会自动传递self的方法是绑定方法,其它通过类名调用、手动传递self的方法调用是非绑定方法,在3.x中没有非绑定方法的概念,它直接被当作是普通函数。...私有属性 python没有private关键字来修饰属性使其变成私有属性,但是带上双下划线前缀的属性且没有后缀下划线的属性(__X)可以认为是私有属性。...需要注意的是,当外部函数链接到实例对象上时,这个链接只对这个实例对象有效,其它对象是不具备这个属性的。如果链接到类上,那么所有对象都可以访问这个链接的方法。...在面向对象上,它允许我们随意地、任意时间地添加属性。...__dict__.keys()) # 报错,对象没有__dict__属性 可以将__dict__放进__slots__中,使得对象可以带有属性字典。

    93821

    核心编程笔记(13.P

    ()在实例化时被调用,即,在AddrBookEntry()被调用时,你可以认为实例化是对__init__()的一种隐式调用,因为传给AddrBookEntry()的参数完全与__init__()接收到的参数是一样的...(除了self,它是自动传递的) 当方法在实例中被调用时,self(实例对象)参数自动由解释器传递,所以在上面的__init__()中,需要参数是nm和ph,他们分别表示名字和电话号码,__init__...__init__(), self把实例对象自动传入__init__() 当对象john被实例化后,它的john.name已经被设置了 访问实例属性: >>> john <__main__.AddrBookEntry...pass ... >>> mc = MyClass() # 初始化类 13.5.2 __init__()"构造器" 方法 当类被调用,实例化的第一步就是创建实例对象,一旦对象创建了,Python检查是否实现了...dir()作用的模块上,显示模块的__dict__内容 dir()不带参数,显示调用者的局部变量 13.12.5 super() super()函数目的就是帮助找出相应的父类,方便调用相关属性 super

    39030

    Python进阶——什么是描述符?

    其实,在开发过程中,虽然我们没有直接使用到描述符,但是它在底层却无时不刻地被使用到,例如以下这些: function、bound method、unbound method 装饰器property、staticmethod..._set__ 被调用,参数 obj 是 Person 实例,value 是25 当调用 p1.age = -1时,__set__ 没有通过校验,抛出 ValueError 其中,调用 __set__ 传入的参数...这里的 a 和 b 可能存在以下情况: a 可能是一个类,也可能是一个实例,我们这里统称为对象 b 可能是一个属性,也可能是一个方法,方法其实也可以看做是类的属性 其实,无论是以上哪种情况,在 Python...如果是非数据描述符,则调用非数据描述符的 __get__ 如果也不是一个非数据描述符,则从类属性中查找 如果类中也没有这个属性,抛出 AttributeError 异常 写成代码就是下面这样: # 获取一个对象的属性...__ 中存储 当 function 被实例调用时,它是一个 bound method 当 function 被类调用时, 它是一个 unbound method function 是一个非数据描述符,我们之前已经讲到了

    37930

    python Class(类) and

    类被实例化为对象时才有相关的一些数据,才会对该对象的一些属性进行赋值,这些值就是所谓的数据。从某种角度理解这些对象属性就是变量。为对象属性赋值就是为变量赋值。...python规定,没有实例,方法不允许被调用,此即为“绑定”     class语句中的赋值语句会创建类属性,如前面例子中的spam     在类方法中对传给该方法的特殊参数self进行赋值会创建实例属性...gender属性,通过爬树搜索,gender属性会从MyClass类中获取到        x.name      在SetName方法调用之前,Myclass类不会把name属性附加到实例x上,当然也可以重载...当类被实例化成对象时,这些访问就会被自动调用。 创建实例时,python会自动调用类中的__init__方法,以隐性地为实例提供属性。__init__方法被称为构造器。...python在计算操作符时会自动调用这样的方法,例如: 如果对象继承了__add__方法,当它出现在+表达式中时会调用这个方法。     通过重载,用户定义的对象就像内置的一样。

    91620

    Python深入03 对象的属性

    一个对象的属性还可能是该对象实例定义的,叫做对象属性(object attribute)。 对象的属性储存在对象的__dict__属性中。__dict__为一个词典,键为属性名,对应的值为属性本身。...当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到那个属性。(某个属性可能出现再不同的层被重复定义,Python向上的过程中,会选取先遇到的那一个,也就是比较低层的属性定义)。...当某个属性被修改时,我们希望依赖于该属性的其他属性也同时变化。这时,我们不能通过__dict__的方式来静态的储存属性。Python提供了多种即时生成属性的方法。其中一种称为特性(property)。...当我们查询一个属性时,如果通过__dict__方法无法找到该属性,那么Python会调用对象的__getattr__方法,来即时生成该属性。...在Python开发中,你有可能使用这种方法来更合理的管理对象的属性。

    1.2K70

    Python中反射

    参考链接: Python中的反射 反射  运行时,区别于翻译时,指的是程序被加载到内存中执行的时候。 反射,reflection,指的是运行时获取类型定义信息。...一个对象能够在运行时,像照镜子一样,反射出其类型信息。简单说,在Python中,能够通过一个对象,找出其type、class、attribute或method的能力,称为反射或自省。...__dir__()))  上例通过属性字典__dict__来访问对象的属性,本质上就是利用反射的能力,但是上面的例子中,访问的方式不优雅,Python提供了内置的函数  内建函数意义getattr(object...,name[,default])通过name返回object的属性值,当属性不存在,将属性不存在,将使用default返回,如果没有default,则抛出AttributeError,name必须是字符串...异常  它的return值将作为属性查找的结果如果抛出AttributeError异常,则会直接调用__getattr__方法,因为属性没有找到 __getattribute__方法中为了避免在该方法中无线递归

    87200

    Python入门之面向对象编程(四)Python描述器详解

    ,score没有被改变 当我们有很多这样的属性时,如果每一个都去使用@property,代码就会过于冗余。...在讲具体如何实现之前,我们要先了解更多关于描述器的调用机制 描述器的调用机制 aa.m命令其实是查找m属性的过程,程序会先到哪里找,没有的话再到哪里找,这是有一个顺序的,说明访问顺序时需要用到__dict...__dict__['fun']() # 报错,说明函数不是这么调用的 __dict__方法返回的是一个字典,类和实例都可以调用,键就是类或实例所拥有的属性、方法,可以用这个字典访问属性,但是方法就不能这样直接访问...__dict__) # 只有n没有m, 因为资料描述器同名时,不会访问到属性,会直接访问描述器,所以属性里就查不到m这个属性了 print(AA....而普通实例方法用字典调用得到的是一个function即函数,理论上是可以用括号直接调用的,但是调用时报错说少了self参数,其实它也是描述器对象,用通过__get__方法将self传入来调用 三种方法本质上调用

    87570

    面试复习-Python-面向对象

    抽象类是一种不能被实例化的类,它只能作为其他类的父类,用于定义一些抽象方法,这些方法没有具体的实现,需要在子类中实现 from abc import ABC, abstractmethod class...类方法: 可以访问类变量,通过 cls 参数可以访问和修改类的属性。不能直接访问实例变量,因为没有实例对象的引用。 静态方法: 不能访问类变量和实例变量,它完全独立于类和实例的状态。...,从而达到访问旧类中属性和方法的目的 Python的多重继承在查找属性和方法是广度优先搜索的 类相关的内建函数 >>> issubclass(BoyStudent, Student) True >>>...当定义了 slots 时,Python 不会为每个实例创建一个 dict 属性字典来存储实例的属性。...__ attribute 描述符方法 get set delete 在 Python 中,描述符是一种实现了特定协议(__get__、__set__和__delete__方法)的对象,用于控制对另一个对象属性的访问

    8810

    python3 入门 (四) 类与继承

    在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类。...如果属性不存在,会创建一个新属性 delattr(obj, name) : 删除属性 Python内置类属性 __dict__ : 类的属性(包含一个字典,由类的数据属性组成) __doc__...,当对象不再被使用时,__del__方法运行: 类的封装 python通过变量名命名来区分属性和方法的访问权限,默认权限相当于c++和java中的public 类的私有属性: __private_attrs...:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。...在python中继承中的一些特点: 1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。使用super().

    926120

    python-__getattr__ 和

    查看一些博客和文章后,发现想要彻底理解getattr和getattribute的区别,实际上需要理解python中属性的查找顺序、描述器(descriptor)、__get__、__set__、__dict...假设 t = T(),t.at的查找顺序如下: 1、如果是python自动产生的属性,返回,否则进行第2步 2、如果‘at’出现在了T或者其父类和祖先类的__dict__中(即‘at’是一个类属性,并非只属于...不是data descriptor或者没有该属性则进行第2步。 3、查找实例t的__dict__中是否有at属性,有则返回,没有则到第3步。...3.2 ​ 4.2 返回__dict__['at'] 5、如果实例t的父类中有__getattr__方法,则调用该方法,没有则抛出AttributeError。...,‘not_desc’在类的__dict__被找到了,但不是descriptor,所以执行第2步,在实例的__dict__中发现该属性,返回。

    40820

    每天一道 python 面试题 - Python反射与自省

    1.反射自省的概念 自省:自省就是能够获得自身的结构和方法,给开发者可以灵活的调用,给定一个对象,返回该对象的所有属性和函数列表,或给定对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例...使用参数,尝试返回该对象的有效属性列表 dir(MyNewClass) #通过dir()可以查看类的属性 ['__class__', '__delattr__', '__dict__', '_...例如,如果你在一个类中添加了 __slots__属性,那么这个类的实例将不会拥有 __dict__ 属性,但是 dir() 仍然可以找到并列出它的实例所有有效属性 MyNewClass....getattr(ta, 'bar') #取得bar的值,但是对象没有该值,抛出异常 ---------------------------------------------------------...-80-f6c57b29833a> in () ----> 1 getattr(ta, 'bar') #取得bar的值,但是对象没有该值,抛出异常 AttributeError:

    73810
    领券