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

Python教程第6章 | Python面向对象

只有声明了是类方法,才能使用类属性 类方法想要使用类属性,在第一个参数中,需要写上 cls , cls 是 class 的缩写,其实意思就是把这个类作为参数,传给自己,这样就可以使用类属性了。...主要的不同点有: 类方法里面没有了 @classmethod 声明了,不用声明他是类方法 类方法里面的参数 cls 改为 self 类的使用,变成了先通过 实例名 = 类() 的方式实例化对象,为类创建一个实例...,然后再使用 实例名.函数() 的方式调用对应的方法 ,使用 实例名.变量名 的方法调用类的属性 这里说明一下,类方法的参数为什么 cls 改为 self ?...相信为什么要这么做,这么证明。 还是那句话多想,多敲。 回归正题,从运行的结果来看,类方法改变了,实例方法也是会跟着改变的。 在这个例子中,我们需要改变类方法,就用到了类的重写。...在类内部的方法中使用时 self.__private_attrs。 为什么只能说一般情况下呢? 因为实际上, Python 中是没有提供私有属性等功能的。

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

    Python多继承、super与MRO算法

    可能有的同学会问,super的第2个参数的值为什么是self呢?我们都知道,在Python中,self表示类本身的实例,那么为什么不是B()或是A()呢?...__init__(c) c = C(None) b = B(None) B(b) B(c) 这段代码在创建B实例之前,先创建了一个C类的实例以及一个传入None的B实例。...而在B类的构造方法中多了一个参数,用于传入这个外部实例,并将这个外部实例作为super类构造方法的第2个参数传入。...由于在创建C类和B类实例时传入了None,所以super类构造方法的第2个参数值也是None。...其实Python编译器在解析类时,会将当前类的所有父类(包括直接和间接父类)按一定的规则进行排序,然后会根据super类构造方法的第一个参数的值决定使用哪一个父类。那么这个顺序是怎样的呢?

    53510

    python基础六

    注意:我们导入模块时,会现在本地文件中查找该模块,再去系统变量中查找也就是说如果我们将本地py文件的命名修改成上篇文章的任意一个,再去使用它就会报错。 如果我想要调用Test中的Getstr方法呢?...__dict__['name'] Person:类名,可以自己定义 gamename:静态属性,不会改变 但是调用用类名调用 __init__:当实例化Person 会执行的函数 #实例化就会输出:正在定义属性...self: self变量,可以看作包含所有属性的字典 *args:参数 实例化的参数会在__init__中接收 类是抽象的,他只负责定义一些属性和功能,经过实例化之后变成对象。...反过来 import 一个模块的过程就是一个实例化的过程 另:类是可以当作一个属性传入到另一个类中的。 面向对象之封装,继承,多态 继承:#为什么继承?...在python2.7中遵守深度优先的原则 多态: 一个方法表现的不同形式: class A: def write(self): print('A') class B: def

    62230

    KVO详解(一)

    获取到的是创建self.person实例对象的那个类。...中间类中做了什么? 现在我们知道了,当一个实例对象被KVO观察之后,该对象的isa指针会被改变,指向一个动态生成的新的类,这个新的类继承自原类。 那么这个动态类里面做了什么事情呢?...为什么NSKVONotifying_LVPerson继承自LVPerson,但是LVPerson中的有些方法在NSKVONotifying_LVPerson中却没有打印出来呢?...前面我不是有提到,要通过对象的class方法来获取对象的类,而不是通过isa指针:通过isa指针有可能会获取到中间的类,而通过class方法获取到的,肯定是最初创建该实例对象的那个类。...为什么通过class就能获取到最初的那个类呢?这里就解释了原因了,因为在动态子类中对class方法进行了重写,它指向的就是动态子类的父类,即最初的那个类。

    76431

    手撕Python之面向对象

    但是我们的函数中并没有进行接收的操作 所以这个是会进行报错的 那么我们如何通过这个对象进行类方法的调用呢?...我们在这个类方法中添加一个参数self用来接收传过来的对象信息 那么我们就能进行调用了 这种在类函数中添加self的操作叫做实例方法 哪个对象调用它,它就接收哪个对象的信息 所以self==对象本身 所以我们在类里面我们用...self的类方法我们只能够通过类名进行调用 每次通过类名进行类方法的调用这个里面的值都是固定的 但是我们通过这个实例方法进行调用的话,那么我们这个里面的值就随着对象的改变而改变 class Person...,因为我们在调用类方法的时候通常是会在函数中传递实参的,但是我们的类函数中并没有形参进行接收,那么就会造成报错的现象,但是我们的实例方法中,我们在原本的类函数的基础上添加了self这个参数用来接受对象的信息的...#100 #三室一厅 #为什么是这样的呢? #我们可以试试看看搜索顺序是如何的 print(Son.

    7310

    Python学习(七)---- 面向对象学习(类)

    这个类的实例 4 5dog1.bulk() # 调用内部方法 2.2 参数self 初始化一个实例,就需要调用这个类一次: 1dog1 = Dog("wangcai") # 生成一个实例,会自动把参数传给...) 依然没给self传值 ,但Python还是会自动的帮你把dog1 赋值给self这个参数, 为什么呢?...因为,你在bulk(..)方法中可能要访问dog1的一些其它属性呀, 比如这里就访问了dog1的名字,怎么访问呢?...比如存放用户信息,用户姓名等属性可以放在实例变量里,国籍都是中国,可以放在类变量里。 但是,类变量和类方法方法不在实例中,调用怎么调用呢?...而是在实例里添加一个属性 6 7Dog.n ="ccc" #改变类变量 2.5 析构函数、私有属性和私有方法 析构函数:跟构造函数相反。

    42320

    Python基础之:Python中的类

    通过访问x中的i值,我们可以发现这个i值是和MyClass类变量中的i值是一致的。 实例化操作(“调用”类对象)会创建一个空对象。...如果你想在实例化的时候做一些自定义操作,那么可以在类中定义一个 __init__() 方法时,类的实例化操作会自动为新创建的类实例发起调用 __init__()。...虽然方法的第一个参数常常被命名为 self。 这也不过就是一个约定: self 这一名称在 Python 中绝对没有特殊含义。 方法对象的特殊之处就在于实例对象会作为函数的第一个参数被传入。...为什么方法对象不需要传入self这个参数呢?从 x.f的输出我们可以看出,这个方法已经绑定到了一个实例对象,所以self参数会被自动传入。...复制代码 类变量和实例变量 在类变量和实例变量的使用中,我们需要注意哪些问题呢?

    79120

    Python基础之:Python中的类

    通过访问x中的i值,我们可以发现这个i值是和MyClass类变量中的i值是一致的。 实例化操作(“调用”类对象)会创建一个空对象。...如果你想在实例化的时候做一些自定义操作,那么可以在类中定义一个 __init__() 方法时,类的实例化操作会自动为新创建的类实例发起调用 __init__()。...虽然方法的第一个参数常常被命名为 self。这也不过就是一个约定: self 这一名称在 Python 中绝对没有特殊含义。 方法对象的特殊之处就在于实例对象会作为函数的第一个参数被传入。...为什么方法对象不需要传入self这个参数呢?从 x.f的输出我们可以看出,这个方法已经绑定到了一个实例对象,所以self参数会被自动传入。...类变量和实例变量 在类变量和实例变量的使用中,我们需要注意哪些问题呢?

    73120

    Python基础之:Python中的类

    通过访问x中的i值,我们可以发现这个i值是和MyClass类变量中的i值是一致的。 实例化操作(“调用”类对象)会创建一个空对象。...如果你想在实例化的时候做一些自定义操作,那么可以在类中定义一个 __init__() 方法时,类的实例化操作会自动为新创建的类实例发起调用 __init__()。...虽然方法的第一个参数常常被命名为 self。 这也不过就是一个约定: self 这一名称在 Python 中绝对没有特殊含义。 方法对象的特殊之处就在于实例对象会作为函数的第一个参数被传入。...为什么方法对象不需要传入self这个参数呢?从 x.f的输出我们可以看出,这个方法已经绑定到了一个实例对象,所以self参数会被自动传入。...类变量和实例变量 在类变量和实例变量的使用中,我们需要注意哪些问题呢?

    74650

    2022年最新Python大数据之Python基础【九】面向对象与继承

    添加:self.属性名 = 值 获取:self.属性名 一般实例属性写在实例方法中,调用该方法才能获取实例属性,对象创建后,其中一个实例调用该方法,获取实例属性,其余对象不发生变化 # 实例属性在类的内部添加或获取的格式...# 如果我们能够将参数传递到init方法中,是不是就可以在创建对象时,动态添加属性值了呢? # 我们怎样给init进行传参呢?...# 在实例化对象时,类名(参数1, 参数2....)这些参数会传递给init方法,进行使用 # class Person(object): # def __init__(self, name,...# Jack 18 # 结论: 在Person类创建对象时,在()内添加参数,可以被init接收但是,传参数量和inti方法中的形参必须一致 # 怎样实现动态的实例属性添加呢?...,直接调用子类中的方法,不会调用父类的 重写时只要方法名称相等即可,不需要进行参数的校对 为什么可以重写父类方法,因为在调用方法或者属性时,会按照继承层级依次查找 # 定义一个Person类 class

    31510

    Python基础:Python类(真累~

    s1_num:11   s2_num:22   Manage_num:22 """  问题:为什么修改num的值以后,实例s1和实例s2会有不同的结果呢 ?             ...self代表的就是实例本身 修改实例的属性,希望初始化的参数放置在init下面。(个人觉得,这个初始化参数可以是一切对象!)...__del__()   自定义方法:   除去类中自带的以_下划线开头的函数,在类中定义一个函数,实现相应的功能。...删除数据 p = Person()del p['name'] 自动运行delitem __new__ __new__是创建类实例的方法,并且会阻止init运行,使用return 返回new创建的实例值,...学名叫元类!     也许有人会问那为啥type()能查看到数据类型呢?     可能你会注意到,type的结果前是class。。。

    71320

    卧槽,好强大的魔法,竟能让Python支持方法重载

    你真的了解方法重载吗? 方法重载是面向对象中一个非常重要的概念,在类中包含了成员方法和构造方法。...Python会从头扫描所有的方法,遇到一个方法,就会将这个方法添加到类维护的字典中。...我们采用的方案是创建一个MultiMethod类,用于保存同名方法的所有实例,而key不变,仍然是方法名,只是value不再是方法对象,而是MultiMethod对象。...另外一个核心魔法方法是__call__,该方法在调用对象方法时被调用,可以在该方法中扫描调用时传入的值参的类型,然后将参数类型转换成元组,再到MultiMethod类维护的字典中搜索具体的方法实例,并在..._methods[tuple(types)] = meth # 当调用MyOverload类中的某个方法时,会执行__call__方法,在该方法中通过参数类型注解检测具体的方法实例,然后调用并返回执行结果

    2K20

    您好,这里有一份 “实例”请您接收一下。

    写在之前 昨天写了类属性,作为不分家的小伙伴,今天当然是来说说 “实例”。我在之前的文章中说过,类是对象的定义,实例才是真实的东西。...比如 “人” 是一个类,但是 “人” 终究不是具体的某个会喘气的,只有 “rocky” 才是具体的东西,但他是具有 “人” 这个类所定义的属性和方法。“rocky” 就是 “人” 这个类的实例。...那么对于一个实例来说这个建立的过程是怎么进行的呢?...当我们创建完实例,接下来就是调用类,当类被调用以后,先是创建一个实例对象,然后检查是否有 __init__(),如果有的话就调用这个方法,并且将实例对象作为第一个参数 self 传进去,如果没有的话,就只是返回实例对象...在写这篇文章的时候,查了一些资料,看到几个之前没有注意到的点,我也在文章中给大家提醒了,知识就是这样,有很多你会忽略的东西,永远不要觉得基础不重要,也永远不要小看 “简单” 这个词。

    24800

    python基础 面向对象编程

    面向对象编程的基本思想   类和实例     类用于定义抽象类型     实例根据类的定义创建出来 python 定义类并创建实例   在python 中,通过class 关键字定义,以Person 为例...在定义Person 类时,可以为Person 类添加一个特殊的 _init_()   在创建实例时,_init_() 方法被自动调用,我们能再此为每个实例   都统一加以下属性:     class Person...python 中类属性和实例属性名字冲突怎么办。     修改类属性会导致所有实例访问到的类属性全部收到影响,但是,     如果在实例变量上修改类属性发什么问题呢。     ...python 中定义实例方法     实例的方法就是在类中定义的函数,它的第一个参数永远     是self,指定调用该方法的实体本身,其他参数和一个普通     函数完全一样的。     ...在class 中定义的全部是实例方法,实例方法第一个参数 self     是实例本身。       在class 中定义类方法,需要这么些。

    57440

    Python super()方法、多继承以及MRO顺序

    方法,对父类的传参数,应该是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错 单继承时,使用super方法,则不能全部传递,只能传父类方法所需的参数,否则会报错 多继承时,相对于使用类名...为什么改变了 Parent.x 的值还会改变 Child2.x 的值,但是同时 Child1.x 值却没有改变? 这个答案的关键是,在 Python 中,类变量在内部是作为字典处理的。...如果一个变量的名字没有在当前类的字典中发现,将搜索祖先类(比如父类)直到被引用的变量名被找到(如果这个被引用的变量名既没有在自己所在的类又没有在祖先类中找到,会引发一个 AttributeError 异常...因此,在父类中设置 x = 1 会使得类变量 x 在引用该类和其任何子类中的值为 1。这就是因为第一个 print 语句的输出是 1 1 1。...最后,如果该值在父类中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响到任何未重写该值的子类当中的值(在这个示例中被影响的子类是 Child2)。

    1.6K30

    面向对象进阶

    将在内存中创建一个对象,名字就是MyClass。这个对象(类对象MyClass)拥有创建对象(实例对象)的能力。...使用type创建带有方法的类 最终你会希望为你的类增加方法。只需要定义一个有着恰当签名的函数并将其作为属性赋值就可以了。...type就是Python在背后用来创建所有类的元类。现在你想知道那为什么type会全部采用小写形式而不是Type呢?...如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。 现在的问题就是,你可以在__metaclass__中放置些什么代码呢?答案就是:可以创建一个类的东西。...那么什么可以用来创建一个类呢?type,或者任何使用到type或者子类化type的东东都可以。 8. 自定义元类 元类的主要目的就是为了当创建类时能够自动地改变类。

    33610

    Python中通过对象不能调用类方法和静态方法的解析

    当我们在使用Python编写程序时,可能会遇到通过对象调用类方法和静态方法失败的问题,那么这是为什么呢?接下来,我们将从多个方面对这个问题进行详细解析。...类方法和静态方法都是定义在类中的一种方法,可以通过类名直接调用,而不需要先创建该类的实例。...二、对象调用方法的原理在Python中,对象调用方法的原理可以简单概括为:Python通过找到方法所在的类,并将该对象作为第一个参数(通常用self)传入方法中。...三、不能通过对象调用类方法和静态方法的原因既然Python中对象调用方法的原理是将该对象作为第一个参数传入方法中,那么为什么不能通过对象调用类方法和静态方法呢?...3.1 类方法在类方法中,第一个参数是cls而不是self,表示该类本身。因此,如果我们通过对象调用类方法,那么实际上传入的参数不是该类本身,而是该对象本身,这就会导致类型错误。

    94930
    领券