精华内容
下载资源
问答
  • 所以今天和大家分享下python中的类和对象,深入理解下python中的类和对象。1.鸭子类型当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。这个就是鸭子类型的定义,在python中...

    刚开始学习python的时候或者其他面向对象的编程语言的时候,难免会对类和对象理解得不太清楚。所以今天和大家分享下python中的类和对象,深入理解下python中的类和对象。

    1.鸭子类型

    当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。这个就是鸭子类型的定义,在python中,并不关心这个对象是什么类型,只关心他的行为。由行为来推断出该对象所属于的类型。就比如列表(list)、元组(tuple)、字典(dict)等等,这些类都是可迭代的,所以说他们是可迭代对象。

    from collections import Iterable
    l = [1, ]
    t = (1, )
    d = {'d'3}
    print(isinstance(l, Iterable))
    print(isinstance(t, Iterable))
    print(isinstance(d, Iterable))

    # 结果
    True
    True
    True复制代码

    2.类变量和实例变量

    类变量就是在类内定义的,但是不在方法内定义的,而且前缀无self作为引用。实例变量就是有self作为引用的存在类中的变量。类变量是所有对象共享的,在类中修改时,其他的对象也会跟着变。但是需要注意的是,如果是用对象来引用类变量进行修改的话,这里只是新建了和类变量同名的实例变量,并没有修改到。下面用代码解释下。

    class Student(object):
       conutry = 'China'  # 这个是类变量

       def __init__(self, name, sex):
           self.name = name  # 这个是实例变量,也就是对象变量
           self.sex = sex  # 对象变量


    s1 = Student('张三''man')
    s2 = Student('里斯''woman')
    print(s1.conutry)
    print(s2.conutry)
    print(Student.conutry)复制代码

    上面的结果都是三个China,这个很容易知道,用类来引用改变时

    Student.conutry = 'cn'  # 这个是用类引用来进行修改
    复制代码

    修改后打印下三个结果都是修改后的结果。但是下面这个呢?

    s1.conutry = 'zhongguo'  # 用实例来引用进行修改

    这次结果就不一样了,只有s1的类变量变了,其他两个都是不变的。这是为什么呢?就如上面所说,用实例引用来修改类变量的时候并不是修改,而是新建了这个变量。又由于python查找变量是由下往上查找的,所以会先查找出新建后的变量。

    3.类属性和实例属性之间的访问顺序

    类属性就是定义在类中的方法和变量,实例属性也是一样的。访问顺序就是由下往上查找的,用代码体会一下。

    class A():
       name = 'A'
       def __init__(self):
           self.name = 'a'

    a = A()
    print(a.name)
    # 结果
    a复制代码

    由于是类变量先加载,再到初始化对象,所以才会运行__init__()方法,所以结果很显然就是a。这里由于该类没有继承,就没有很复杂,但是当出现多继承,几个类之间就变得很复杂,这个时候的访问顺序就难多了。下面说下这两种情况,掌握了这两种情况,其他的基本没有问题了。

    (1.适合深度优先查找

    A继承了B,C,B,C分别继承了D,E。深度优先的查找是先去着A,如果A中没有该属性,就去B着,再没有就去D找。D中找不到了再去C找。这种查找情况是没有问题的,但是另一种情况就不合适了。

    2)适合广度优先查找

    这个是A继承了B,C,B,C都继承了D。如果这个用深度优先的算法的话,就会出现一个问题,因为深度优先查找顺序是A->B->D->C。这个是不太合理的,当C中重载了D中的一个方法后,B没有重载,如果要查找C中的该方法,用深度优先的算法就只能找到D中的原始方法,所以说这就不正确了,这时候就需要用广度优先的 算法,这个时候查找顺序就是A->B->C->D。但是当遇到上面的情况时又会出错了。这时怎么办?python3就将所有的属性搜索算法统一成了一个算法:C3算法,这里就不展开说这个算法了,因为太复杂了:)会根据对应情况而实施对应算法,下面用代码来分别体会下以上两种情况

    class E():
       pass

    class D():
       pass

    class C(E):
       pass

    class B(D):
       pass

    class A(BC):
       pass

    print(A.__mro__)
    # 结果
    (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>)复制代码

    __mro__这个属性是获取属性的查找顺序,可以看到就是和我们上面说的一样,用了深度优先的算法。再看另一个

    class D():
       pass

    class C(D):
       pass

    class B(D):
       pass

    class A(BC):
       pass

    print(A.__mro__)
    # 结果
    (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)复制代码

    这个时候就用了广度优先算法,符合与我们刚才所说的,这就是C3算法了哈。

    4.super真的是调用父类吗?

    学过Java的都知道,super()这个方法就是在调用父类的方法,但是在python中就不一定了。我们先看看super的用法

    class A():
       def __init__(self):
           print('A')

    class B(A):
       def __init__(self):
           # python2做法是
           # super(A, self).__init__()
           super().__init__()  # 调用父类的初始化方法
           print('B')

    b = B()
    # 结果
    A
    B复制代码

    上面就是用法了,python2和python3用法不一样,这里我们就只用python3了就行操作。接下来看看super真正的调用情况。

    class A():
       def __init__(self):
           print('A')

    class B(A):
       def __init__(self):
           super().__init__()
           print('B')

    class C(A):
       def __init__(self):
           super().__init__()
           print('C')

    class D(B, C):
       def __init__(self):
           super().__init__()
           print('D')

    d = D()复制代码

    上面这个是我们之前所说的那个适合广度优先算法的多继承,按照我们之前的理解,super调用的是父函数,那么这个结果就会是:

              A   B   C   D

    显然是错误,结果是这个

    是不是觉得很奇怪,但是又很熟悉?是的,这个也是按照刚才的查找顺序一样执行的,如果不信的话我们打印下__mro__就知道了

    是不是刚好倒叙?因为我们是先打印父类的再打印自己的,所以顺序倒了。再看看另外一种情况也是可行的

    class A():
       def __init__(self):
           print('A')

    class B():
       def __init__(self):
           super().__init__()
           print('B')

    class C(A):
       def __init__(self):
           super().__init__()
           print('C')

    class D(B):
       def __init__(self):
           super().__init__()
           print('D')

    class E(DC):
       def __init__(self):
           super().__init__()
           print('E')

    e = E()
    print(E.__mro__)
    # 结果
    A
    C
    B
    D
    E
    (<class '__main__.E'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)复制代码

    也是和预期一样的。总的来说,super不一定是调用父类,它的调用顺序也是遵循mro算法的,就是属性查找算法,和上文说的C3算法一致。

    有任何问题欢迎在留言区提问,或者有不当的地方也欢迎指出

    ps:如果觉得文章不错的话,欢迎随手点赞转发支持

    日常学python

    代码不止bug,还有美和乐趣

    展开全文
  • Python中的类和对象

    千次阅读 2018-07-12 22:26:39
    什么是对象呢?首先,我们先来说说什么是类。看了很多关于python类的介绍,大多都介绍如何使用,但是对于概念却一笔带过,一个初学编程小伙伴很难理解。概括说:可以比作某种类型集合描述。然而抽象描述...
    一、什么是类?什么是对象呢?

    首先,我们先来说说什么是类。看了很多关于python类的介绍,大多都介绍如何使用,但是对于概念却一笔带过,一个初学编程的小伙伴很难理解。概括的说:类可以比作是某种类型集合的描述。然而抽象的描述,对于初学者来说并没有什么用。今天就来详细的说说:我们把一类相同的事物叫做类,其中用相同的属性(其实就是变量)描述,里面封装了相同的方法。比如,汽车是一个类,它包括价格、品牌等属性。

    对象就是从类中分离出来

    # object 任何一个对象都直接或者间接继承自object
    # 从功能上定义:类是属性和方法集合
    class Hero(object):
        # 属性
        blood = 700,
        attact = 67,
        level = 1,
        # 方法
        def skill(self):
            print('致盲射击')
    timo =Hero()
    timo.skill()
    print(Hero.blood)
    print(timo.blood)
    class People(object):
        # init初始化
        # 当对象创建的时候 属性的默认值
        # 魔术方法
        count=0
        # 对象创建的时候 会自动调用init方法
        # 如果init方法需要参数的话
        # 那么对象在创建的时候也需要参数
        def __init__(self,name,sex,age):
            self.name = name
            self.sex = sex
            self.age = age
            # 对象方法
        def sleep(self):
            print('{}一天要睡十七八个小时'.format(self.name))
        def work(self):
            print('工作时间太短,不开心')
        def fond(self):
            print('人生苦短,幸亏我甜')
    zhangSan = People('张三','男',17)
    zhangSan.sleep()
    lisi = People('李四','女',21)
    lisi.sleep()
    lisi.work()
    print(People.count)
    # 类属性可以通过对象来调用
    print(lisi.count)
    print(zhangSan.name)

    class Person (object):
        # 如果初始化的时候  设置默认值
        # 那么在创建对象的时候 可以不必设置参数
        def __init__(self,name='',age='',sex='',fond=''):
            self.name = name
            # 属性前面添加下划线 这种方式叫做私有属性
            # 也就是不想被别人访问的属性
            # 但是这种属性不是绝对访问不了
            # 可以通过在属性前添加下划线的方式来访问
            self._age = age
            self._sex = sex
            # 属性如果是双下划线,如果想要调用属性
            # 需要通过 p1._Person__fond这种方式调用
            self.__fond = fond
    
            # get set方法
            # property属性
            # attribute属性
            # argument参数
        @property  #声明set get方法的标记
        def fond(self):
            print('get方法被调用了')
            return self.__fond
        @fond.setter
        def fond(self,fond):
            print('set方法被调用了')
            self.__fond = fond
    
    p1 = Person('张三丰',17,'男','太极')
    # get
    print(p1.name)
    print(p1._age)
    ”
    print(p1._Person__fond)
    # set
    p1.name = '张三丰'
    print(p1.fond)
    p1.fond='练拳'



    展开全文
  • python中的类和对象

    2017-12-26 22:05:07
    定义:class (必须要有初始化_init__,这样创建的每个实例都有自己的属性,也方便直接调用类中的函数变量)->self表示的当前对象:调用对应的变量、调用对应的函数->如果没有在__init__中初始化对应的...

    类->对象->1.他可以做什么行为 2.他是什么样的(属性或特征)

    定义类:class (必须要有初始化_init__,这样创建的每个实例都有自己的属性,也方便直接调用类中的函数和变量)->self表示的是当前类的对象:调用对应的变量、调用对应的函数->如果没有在__init__中初始化对应的实例变量话,导致后续引用实例变量会出错

    类中的方法:__str__是把类中的变量打出来实现字符串形式而不是打出地址形式(只要需要print的时候就必须要进行str)

    访问限制:Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。以单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。

    展开全文
  • 新手理解之python中的类和对象1. 1.类是什么? 类是一个抽象的概念,泛指很多相似的个体组成的,具有共同特征的事物。 比如类是一个车,这车就包括各种车型 2.对象是什么? 类里面的具体的一个事物(必须要实际存在...

    新手理解之python中的类和对象1.

    1.类是什么?
    类是一个抽象的概念,泛指很多相似的个体组成的,具有共同特征的事物。 比如类是一个车,这车就包括各种车型
    2.对象是什么?
    类里面的具体的一个事物(必须要实际存在的一个事务)。 比如 五菱神车S(此车就是实际存在的一种车),他是车这个类的具体化,先有类,才有对象
    类与对象的举例:

    def eating():
        print("吃饭")
    
    def walking():
        print("走路")
    
    eating()
    walking()
    #(输出)    吃饭
    
               走路
    #这样的话,别人也可以调用你写的函数,但是调用eating() 并不能清除的了解到到底
    是谁 “吃饭”
    #所以我们输入一个name来明确是谁在吃草。
    
    def eating(name):
        print(name,"吃饭")
    eating("zhuozi")            #调用函数
    
    #(输出)zhuozi 吃草
    

    3.self和object的区别

    • 在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self。其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法。
    • 在类中,self只能在函数中使用,表示的是实例属性,就是每个实例可以设置不同的值,而不相互影响
      如果在类级别使用没有self的属性,是类属性,一般作为全局变量来用的。
      事实上:就是一个是类属性一个是对象属性,类和实例都可以访问到属性
    • 为什么要继承object类?主要目的是便于统一操作。在python 3.X中已经默认继承object类。所以,继承object类是为了让自己定义的类拥有更多的属性,以便使用。当然如果用不到,不继承object类也可以。

    4.Python的内部函数_init_

    • 使用了 init 方法,在创建实例的时候就不能传入 空的参数了,必须传入与 init 方法匹配的参数,但是 self 不需要传,python解释器会自己把实例变量传进去。
    • init 方法的第一个参数永远是 self ,表示创建的实例本身,因此,在 init 方法的内部,就可以把各种属性绑定到 self,因为 self 就指向创建的实例本身。
    展开全文
  • python3中的类和对象

    千次阅读 2018-05-30 13:39:49
    什么是对象:从同一个类中具体化描述的一个事物被称之为对象什么是类:具有相同特性和方法的抽象概念称之为类类和对象之间的关系:类是对象的抽象概念,对象是类的详细实例化python3中如何定义类以及类中的属性方法...
  • Python中的类对象

    2019-10-11 08:58:16
    类和对象是面向对象编程两个核心概念 1.类 类是对一群具有相同特征或者行为事物一个统称,是抽象,不能直接使用 – 特征被称为属性 他是什么 – 行为被称为方法 他可以做什么 类就是相当于建造房子时...
  • python中一切皆为对象,所谓对象:我自己就是一个对象,我玩电脑就是对象,坐着椅子就是对象,家里养小狗也一个对象。...在python中,把具有相同属性方法的对象归为一个(class) 比如人类,动物,
  • 这篇博客路线由深入浅,所以尽管图画花花绿绿很好看,但是请先关注我文字,因为初接触类小伙伴直接看类实现可能会觉得...一、python中类和对象的概念  首先,我们先来说说什么是类。看了很
  • Python中类和对象以及self作用 1.为什么要使用类 只要定义好类构造函数,就可以很方便生成这个类实例,并且引用数据成员也很方便。 可将类想象成飞机设计图纸,而对象是某种类型飞机(具有这种类型飞机...
  • 基于python的-类和对象

    2018-01-26 11:29:42
    # 类和对象 # 什么是类? # 人类 具有相同的属性和行为特点的事物的抽象的集合 # 人类属性: 身高 体重 年龄 性别 姓名。。。 # 人类行为: 吃喝拉撒睡 # 什么是对象? # 对象概念: 类的具体的实例化 # 人类中的...
  • 1,动态语言静态语言最大的不同,就是函数类的...这为了str保持一致性,str用来创建字符串对象的类,而int用来创建整数对象的类。4,type就是创建类对象的类。你可以通过检查__class__属性来看到这一点(...
  • 用面向对象的思维解决问题重点 当遇到一个需求时候不用自己去实现,如果自己一... 这种方法把软件系统相近相似操作逻辑操作 应用数据、状态,以类的型式描述出来,以对象实例形式在软件系统复用,以达到提
  • 因为python中关于面向对象的内容很多,如果要讲透,最好用面向对象的思想重新学一遍前面内容。这个坑如此之大,犹豫再三,还是只捡一下重要内容来讲吧,不足内容只能靠大家自己去补充了。 惯例声明一下,...
  • 基于python的类和对象

    2018-01-29 21:23:26
    # 类和对象 # 什么是类? # 类的概念:具有相同的属性和行为特点的事物的抽象的集合 # 人类属性:身高,体重,年龄,性别 # 人类的行为:吃喝拉撒睡 # 什么是对象? # 对象概念:类的具体的实例化 # 人类中的对象...
  • 1.新式类和经典类分别是什么? object是Python为所有对象提供的基类,提供有一些内置的属性和方法,可以使用dir函数查看 新式类:以object为基类的类 经典类 不以object为基类的类 2.怎么区分? 在python3.X...
  • python面向对象中的魔法方法和类对象 文章目录python面向对象中的魔法方法和类对象一,魔法方法二,对象 一,魔法方法 1.init __init__方法可以简单的理解为的构造方法(实际并不是构造方法,只是在生成...
  • python中一切皆为对象,所谓对象:我自己就是一个对象,我玩电脑就是对象,坐着椅子就是对象,家里养小狗也一个对象。。。。。。我们通过描述属性(特征)行为来描述一个对象的。比如家里小狗,它颜色...
  • Python3中类Class 是什么 是一个抽象概念,泛指很多相似个体组成,具有共同特征事物。 比如是一个车 ,这车就包括各种车型 什么是对象 里面具体一个事物。 比如 五菱神车S(过弯秒掉GTR...
  • 什么是类和对象2. Python定义一个类2.1 创建成员变量2.2 构造方法2.3 getter和setter2.4 toString方法2.5 python类变量/“静态变量”2.6 Python的魔法方法3. Python继承3.1 子类继承父类3.2 子类调用父类方法...
  • 1、类和对象是什么关系呢? 答:类和对象关系就如同模具和用这个模具制作出物品之间关系。一个类为它全部对象给出了一个统一定义,而他每个对象则是符合这种定义一个实体,因此类和对象关系就是抽象...
  • python中一切皆为对象,所谓对象:我自己就是一个对象,我玩电脑就是对象,坐着椅子就是对象,家里养小狗也一个对象。。。。。。 我们通过描述属性(特征)行为来描述一个对象的。比如家里小狗,它...
  • 本文实例讲述了Python面向对象之类和对象。分享给大家供大家参考,具体如下: 类和对象(1) 对象是什么? 对象=属性(静态)+方法(动态); 属性一般是一个个变量;方法是一个个函数; #类属性 就是 类变量 #...
  • Python3 类和对象

    2018-01-26 22:18:57
    # 类和对象 # 什么是类? # 类概念: 具有相同属性和行为特点事物抽象集合 # ————人类———— # 人类属性: 身高 体重 年龄 性别 姓名。。。。 # 人类行为: 吃喝拉撒睡 # 什么...
  • Python学习之类和对象

    2019-02-15 14:30:27
    中可以放置函数变量,类中的函数可以很方便的使用类中的变量。 在中被定义的函数被称为的【方法】,描述的这个能做什么。我们使用类名.函数名()的格式,就可以让的方法运行起来。在中被定义的变量...
  • 实例属性即同一个类的不同实例,其值互不关联,也不会互相影响,定义时使用“self....简单说,Python中类属性就是给类对象中定义属性,通常用来记录与这个相关特征。注意:属性不会用...
  • Python类和对象

    2018-01-02 19:56:38
    python中一切皆为对象,所谓对象:我们自己就是一个对象,我们玩电脑就是对象,坐着椅子就是对象,家里养小狗也一个对象...   我们通过描述属性(特征)行为来描述一个对象的。比如家里小狗,它...
  • python类和对象

    千次阅读 2016-11-26 18:06:27
    类和对象(1) 对象是什么? 对象=属性(静态)+方法(动态); 属性一般是一个个变量;方法是一个个函数; 例子: class Turtle:#python 类名约定以大写字母开头 '''关于类简单例子。。。''' #属性 color =...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,748
精华内容 699
关键字:

python中的类和对象是什么

python 订阅