您的位置:首页 > 编程语言 > Python开发

Python 内置类属性

2018-01-02 17:22 363 查看
在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"
4000
%(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python