Python 内置类属性

Python 内置类属性,第1张

概述Python内置类属性在python中内置类写类属性,即只要你新建了类,系统就会自动创建这些属性。下面就来讲解一下这些自带的属性。>>>classPeopre(object):...pass...>>>dir(Peopre)['__class__','__delattr__','__dict__','__dir__','__doc__& 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 subject1redirect pythoncpp

__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

转自:https://www.cnblogs.com/yangliguo/p/8178135.HTML

 

总结

以上是内存溢出为你收集整理的Python 内置类属性全部内容,希望文章能够帮你解决Python 内置类属性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1186815.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存