zoukankan      html  css  js  c++  java
  • 类的实例

    一、类实例化:类的实例化就是将类赋值给不同的对象.

    1、实例化对象:

    >>> class newClass():
        pass
    # 像调用函数一样的表达式直接进行类的实例化:
    >>> newObj = newClass()

    2、使用__init__构造器初始化实例:

    >>> class newClass():
        pass
    
    >>> newObj = newClass()
    >>> class newClass():
        def __init__(self,name):
            self.name = name
    # 如果类的__init__函数中有参数且不是默认参数,那么进行实例化时必须将参数传进去,否则将会报错:        
    >>> newObj = newClass()
    Traceback (most recent call last):
      File "<pyshell#21>", line 1, in <module>
        newObj = newClass()
    TypeError: __init__() missing 1 required positional argument: 'name'
    >>> newObj = newClass('new class')
    >>> newObj.name
    'new class'
    >>> 
    
    # 这里可以看到__init__函数的参数使用和普通的函数中的参数是一样的:
    >>> class newClass():
        def __init__(self,name='new class'):
            self.name = name
    >>> newObj = newClass()
    >>> newObj.name
    'new class'
    >>> 

    3、__del__解构器,当实例被删除后会调用这个解构器,和类初始化时是逆过程。

    >>> class InstTrack():
        count = 0
        def __init__(self):
            InstTrack.count += 1
        def __del__(self):
            InstTrack.count -= 1
        def howMany(self):
            return InstTrack.count
    
        
    >>> a = InstTrack()
    >>> b = InstTrack()
    >>> id(a)
    1786701000432
    >>> id(b)
    1786701000544
    >>> a.howMany()
    2
    >>> b.howMany()
    2
    >>> del a
    >>> b.howMany()
    1
    >>> del b
    >>> InstTrack.count
    0

    二、实例属性

    1、通过__init__()构造器设置静态属性;

    2、通过__init__()构造器提供默认属性:和函数定义的默认参数是一样的;

    3、__init__()不应该有return语句,不该返回对象,或者说应该返回None(即使一个函数中没有显示的写return语句,但是依然会默认返回None),由于在实例化时会默认调用__init__构造器,因此如果有return语句,那么实例就是这个返回的对象,而不是类返回的实例了,如:

    # 如果返回非None值在实例化时会报错:
    >>> class MyClass():
        def __init__(self):
            print("Initialized...")
            return 1
    
        
    >>> mc = MyClass()
    Initialized...
    Traceback (most recent call last):
      File "<pyshell#48>", line 1, in <module>
        mc = MyClass()
    TypeError: __init__() should return None, not 'int'
    # 返回Nnone时就不会报错了:
    >>> class MyClass():
        def __init__(self):
            print("Initialized...")
            return None
    
        
    >>> mc = MyClass()
    Initialized...
    >>> 

     三、查看实例属性

    1、dir()内建函数查看类属性:

    >>> class Example():
        pass
    >>> ex.user = 'root'
    >>> ex = Example()
    >>> ex.pri = 775 >>> dir(Example) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] >>> >>> dir(ex) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'pri', 'user'] >>>

     2、__dict__():实例属性组成的字典

    >>> class Example():
        pass
    >>> ex = Example()
    >>> ex.user = 'root'
    >>> ex.pri = 775
    >>> ex.__dict__
    {'pri': 775, 'user': 'root'}
    >>> 

     3、__class__():可以检查实例对象是哪个类初始化而来的

    >>> ex.__class__
    <class '__main__.Example'>
    >>> 

    四、类属性和实例属性

     1、类属性可通过实例获取和修改,实例属性只有实例可以获取和修改。

    >>> class Example():
        version = 1.2    #定义了一个类的静态成员属性
    >>> ex = Example()
    # 在实例中没有创建属性时会通过类以及基类寻找属性,找到后可返回:
    >>> ex.version
    1.2
    # 类可以调用自己的静态属性
    >>> Example.version
    1.2
    # 类修改类属性:
    >>> Example.version = 1.3
    >>> Example.version
    1.3
    # 此时实例属性查看时也发生了变化:
    >>> ex.version
    1.3
    >>> 
    # 但是此处给实例新增加了一个同名的属性,这个属性是这个实例的属性,与类的属性是分开的:
    >>> ex.version = 1.0
    >>> ex.version
    1.0
    # 可以看到类属性是没有变化的:
    >>> Example.version
    1.3
    # 此时再实例化一个新实例,它的属性值也是默认的类属性:
    >>> ex2 = Example()
    >>> ex2.version
    1.3
    # 此时再次删除ex实例属性后,再次访问到的是类属性的值: 
    >>> del ex.version
    >>> ex.version
    1.3

     五、调用和方法的绑定

    1、调用绑定方法:即通过实例调用绑定在实例上的方法,在实际调用时不需要传入self的参数,self作为第一个参数被默认传入。

    >>> class SaySomething():
        def __init__(self,sayWord = 'hello,world!'):
            self.sayWord = sayWord
        def say(self):
            print(self.sayWord)
    >>> say1 = SaySomething()
    # 通过实例调用绑定的方法:
    >>> say1.say()
    hello,world!
    # 通过类调用绑定的方法时会报错:
    >>> SaySomething.say()
    Traceback (most recent call last):
      File "<pyshell#150>", line 1, in <module>
        SaySomething.say()
    TypeError: say() missing 1 required positional argument: 'self'
    >>> 

    2、调用非绑定方法:最常用的是在子类中覆盖父类的方法,如在子类的__init__()构造器中覆盖父类构造器,但是在调用时必须显示的传入self参数,解释器才能知道需要初始化的是一个类而不是绑定在类上的实例:

    >>> class SayOneWord(SaySomething):
        def __init__(self):
            SaySomething.__init__(self)
    
            
    >>> say2 = SayOneWord()
    >>> say2.say()
    hello,world!
    >>> 
  • 相关阅读:
    过滤xml文件内容
    python接口自动化之通过接口模拟一通电话的多段对话
    浅谈python性能与优化
    监控之Linux系统监控命令大全
    mysql windows 5.7 安装版下载地址
    liunx 安装jdk
    下载文件,后台执行没问题,没下载文件
    spring boot thymeleaf
    spring security文档地址
    redis 可视化工具下载地址
  • 原文地址:https://www.cnblogs.com/OnOwnRoad/p/5335296.html
Copyright © 2011-2022 走看看