• Python 内置类属性


    在python中内置类写类属性,即只要你新建了类,系统就会自动创建这些属性。下面就来讲解一下这些自带的属性。

    >>> class Peopre(object):
    ... 	pass
    ... 
    >>> dir(Peopre)
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
    

    下面是常用的几个属性

    常用专有属性 说明 触发方式
    __init__ 构造初始化函数 创建实例后,赋值时使用,在__new__
    __new__ 生成实例所需属性 创建实例时
    __class__ 实例所在的类 实例.__class__
    __str__ 实例字符串表示,可读性 print(类实例),如没实现,使用repr结果
    __repr__ 实例字符串表示,准确性 类实例 回车 或者 print(repr(类实例))
    __del__ 析构 del删除实例
    __dict__ 实例自定义属性 vars(实例.__dict__)
    __doc__ 类文档,子类不继承 help(类或实例)
    __getattribute__ 属性访问拦截器 访问实例属性时
    __delattr__(s,name) 删除name属性 调用时
    __gt__(self,other) 判断self对象是否大于other对 调用时
    __setattr__(s,name,value) 设置name属性 调用时
    __gt__(self,other) 判断self对象是否大于other对象 调用时
    __lt__(slef,other) 判断self对象是否小于other对象 调用时
    __ge__(slef,other) 判断self对象是否大于或者等于other对象 调用时
    __le__(slef,other) 判断self对象是否小于或者等于other对象 调用时
    __eq__(slef,other) 判断self对象是否等于other对象 调用时
    __call__(self,*args) 把实例对象作为函数调用 调用时

    下面将讲解几个常用的:

    __init__():
    __ init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化。注意,这个名称的开始和结尾都是双下划线。

    class Person:
        def __init__(self, name):
            self.name = name
        def sayHi(self):
            print ('Hello, my name is', self.name)
    

      说明:__ init__ 方法定义为取一个参数name(以及普通的参数self)。在这个__ init__ 里,我们只是创建一个新的域,也称为name。注意它们是两个不同的变量,尽管它们有相同的名字。点号使我们能够区分它们。最重要的是,我们没有专门调用__ init__ 方法,只是在创建一个类的新实例的时候,把参数包括在圆括号内跟在类名后面,从而传递给__ init__ 方法。这是这种方法的重要之处。现在,我们能够在我们的方法中使用self.name域。这在sayHi方法中得到了验证。

    __new__ ()
      __ new__ ()在__ init__()之前被调用,用于生成实例对象.利用这个方法和类属性的特性可以实现设计模式中的单例模式.单例模式是指创建唯一对象吗,单例模式设计的类只能实例化一个对象.

    class Singleton(object):
        __instance = None                       # 定义实例
    
        def __init__(self):
            pass
    
        def __new__(cls, *args, **kwd):         # 在__init__之前调用
            if Singleton.__instance is None:    # 生成唯一实例
                Singleton.__instance = object.__new__(cls, *args, **kwd)
            return Singleton.__instance
    

    __str__ ()
      __ str__ ()用于表示对象代表的含义,返回一个字符串.实现了__ str__ ()方法后,可以直接使用print语句输出对象,也可以通过函数str()触发__ str__ ()的执行.这样就把对象和字符串关联起来,便于某些程序的实现,可以用这个字符串来表示某个类

    class Cat:
        """定义了一个Cat类"""
    
        #初始化对象
        def __init__(self, new_name, new_age):
            self.name = new_name
            self.age = new_age
    
        def __str__(self):
            return "%s的年龄是:%d"%(self.name, self.age)
    

    __del__()

      __ del__称作析构方法
      析构方法,当对象在内存中被释放时,自动触发执行。
        注:此方法一般无须定义,因为在Python中,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。在程序执行结束之后,执行此方法

    class Foo:
    
        def __del__(self):
            print('run __del__')
    

    __getattribute__:

    class Itcast(object):
        def __init__(self,subject1):
            self.subject1 = subject1
            self.subject2 = 'cpp'
    
        #属性访问时拦截器,打log
        def __getattribute__(self,obj):
            if obj == 'subject1':
                print('log subject1')
                return 'redirect python'
            else:   #测试时注释掉这2行,将找不到subject2
                return object.__getattribute__(self,obj)
    
        def show(self):
            print('this is Itcast')
    
    s = Itcast("python")
    print(s.subject1)
    print(s.subject2)
    
    

    运行结果:

    log subject1
    redirect python
    cpp
    
    

    __getattribute__的坑

        class Person(object):
            def __getattribute__(self,obj):
                print("---test---")
                if obj.startswith("a"):
                    return "hahha"
                else:
                    return self.test
    
    
            def test(self):
                print("heihei")
    
    
        t.Person()
    
        t.a #返回hahha
    
        t.b #会让程序死掉
            #原因是:当t.b执行时,会调用Person类中定义的__getattribute__方法,但是在这个方法的执行过程中
            #if条件不满足,所以 程序执行else里面的代码,即return self.test  问题就在这,因为return 需要把
            #self.test的值返回,那么首先要获取self.test的值,因为self此时就是t这个对象,所以self.test就是
            #t.test 此时要获取t这个对象的test属性,那么就会跳转到__getattribute__方法去执行,即此时产
            #生了递归调用,由于这个递归过程中 没有判断什么时候推出,所以这个程序会永无休止的运行下去,又因为
            #每次调用函数,就需要保存一些数据,那么随着调用的次数越来越多,最终内存吃光,所以程序 崩溃
            #
            # 注意:以后不要在__getattribute__方法中调用self.xxxx
    
  • 相关阅读:
    HDU 3507 PrintArticle (单调队列优化)
    BZOJ 1911 (特别行动队)
    POJ 3709 K-Anonymous Sequence (单调队列优化)
    邓_php面试【002】——完整版
    邓_正则表达式
    邓_PHP面试2
    邓_PHP面试【001】
    网站大全
    Jquery 获取对象的几种方式介绍
    邓_Jquery测试题
  • 原文地址:https://www.cnblogs.com/yangliguo/p/8178135.html
一二三 - 开发者的网上家园