zoukankan      html  css  js  c++  java
  • Python—类和实例对象

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

    简介:所谓的类只是一个抽象的定义,而实例则是具体的对象。它们之间的差别就想我脑海中的石头和我手中的石头一样,只有后者才真实存在。类就是一个模板,每一个类创建好之后,就是一个模板。可以用这个模板生成一个个实例对象。

    新旧式类的差别

    object 是 Python 为所有对象提供的 基类,提供有一些内置的属性和方法,可以使用 dir 函数查看。

    新式类:以 object 为基类的类,推荐使用。

    经典类:不以 object 为基类的类,不推荐使用。

    在 Python 3.x 中定义类时,如果没有指定父类,默认使用 object 作为该类的基类 —— Python 3.x 中定义的类都是 新式类。

    在 Python 2.x 中定义类时,如果没有指定父类,则不会以 object 作为该类的基类。

    # -*- coding:utf-8 -*-
    class NewClass(object):   # 可以不写object,默认就是object
        pass
     
    class OldClass:
        pass
     
    New = NewClass()        # 创建一个新式类的实例
    Old = OldClass()        # 创建一个经典类的实例
    print(type(NewClass))   # python3结果:<class 'type'>                       python2结果:<type 'type'>
    print(type(New))        # python3结果:<class '__main__.NewClass'>          python2结果:<class '__main__.NewClass'>
    print(type(OldClass))   # python3结果:<class 'type'>                       python2结果:<type 'classobj'>
    print(type(Old))        # python3结果:<class '__main__.OldClass'>          python2结果:<type 'instance'>
    

    在python2运行结果中,我们可以看见经典类输出很含糊,经典类属于类对象,无论是哪个类,都统一为“类”类型,实例属于实例类型,却不知道其是由哪个类创建的,所以的实例都统一为“实例”类型。

    也就是说当时的类型用 classobj 和 instance 代表了所以的类和实例,无论你是哪个类,又或是哪个类创建的实例。这样的信息实在太少,而类和类型之间非常混乱。为了解决这种情况,在 python2.2 中引入了新式类,并进行了类和类型的同统一。

    创建实例对象

    # -*- coding:utf-8 -*-
    class NewClass(object):
        def __init__(self, age):
            self.age = age
     
    # 创建方式1
    obj1 = NewClass(123)              # 通过类名+(),来创建实例对象
    print(obj1.age,id(obj1))          # 结果:123  140408922671424
    
    # 创建方式2
    obj2 = type(obj1)(321)            # 对实例来说type返回的是类对象,又可以用类对象来创建新的实例
    print(obj2.age,id(obj2))          # 结果:321  140408922670360
    

    总结的来说:在新式类中,所以的类对象都是 type 的实例。而不同的类对象又能创建出其对应的实例。

    创建一个完整的类

    class Person:
        def __init__(self, name, gender):
            self.__name = name       # 私有实例变量(__name)前有2个下划线
            self.gender = gender
            
        def getName(self):
            return self.__name
     
    if __name__ == "__main__":
        person=Person("张三", 26)  
        # print(person.__name)
        print(person.getName())

    https://www.liaoxuefeng.com/wiki/1016959663602400/1017496031185408

  • 相关阅读:
    Uva 10779 collector's problem
    poj 2728 最优比率树(最小生成树问题)
    LA 3126 二分图匹配 最小路径覆盖
    poj 1149 最大流构图
    Step By Step(Java XML篇)
    Step By Step(Java 输入输出篇)
    Step By Step(Java 集合篇)
    Step By Step(Java 线程篇)
    Step By Step(Java 反射篇)
    Step By Step(Java 国际化篇)
  • 原文地址:https://www.cnblogs.com/liuhaidon/p/12066383.html
Copyright © 2011-2022 走看看