python内置类属性_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>