常用类、实例内置属性

Python下一切皆对象,每个对象一般都有多个属性(attribute)。同样每个Python类会带有内置属性(包括数据属性和方法属性),即只要你新建了类,系统就会自动创建这些属性。这些内置的类属性一般以双下划线开头,以双下划线结尾。如下一个类

class Student():

         country="china"

         def __init__(self,sname,ssex):

                   self.name=sname

                   self.sex=ssex

         def setage(self,age):

                   self.age=age

        

         def getinfo(self):

                   return "my name is"+self.name+",and i'm "+ str(self.age)+" years old."

使用dir()函数看下类及其类实例有那些属性。如

>>>dir(Student)

['__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__', 'country', 'getinfo', 'setage']

 

>>>dir(stu)

['__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__', 'age', 'country', 'getinfo','name', 'setage', 'sex']

>>> 

dir()函数会自动寻找一个对象的所有属性(对于类来说,还包括从父类中继承的属性)。因为我们这里用的是新式类,新式类继承于父类 object ,而这些我们没有写的属性,都是在 object 中定义的。如

>>>dir(object)

['__class__','__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__','__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__','__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__','__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

>>> 

      这些内置的属性可以使用点运算符像任何其他属性一样来访问。下面介绍几个比较重要的属性。

__class__

这个属性只有实例中有,它表示创建这个实例的类是哪个(一般自定义类的全名是'__main__.className')。如

>>>Student.__class__

>>>

>>>stu.__class__   

>>> 


__dict__

这个特殊属性用来存储对象属性,它是一个字典,其键为属性名,值为属性的值。

首先看一下类的__dict__,如

>>> Student.__dict__

mappingproxy({'__module__': '__main__', 'country':'china', '__init__': ,'setage': , 'getinfo': , '__dict__': , '__weakref__': , '__doc__': None})

>>> 

       再看一下,实例对象的__dict__,我们新实例化一个对象,如

>>> newstu=Student("xiao zhang","fmale")

>>>

>>> newstu.__dict__

{'name': 'xiao zhang', 'sex': 'fmale'}

>>> 

       可见,实例的__dict__仅存储与该实例相关的实例属性,并不包含该实例的所有有效属性,这也说明了正是因为实例的__dict__属性,每个实例的实例属性才会互不影响。。所以如果想获取一个对象所有有效属性,应使用dir()。可以说__dict__是dir()的子集,dir()包含__dict__中的属性。

类的静态函数、类函数、实例函数、类变量以及一些内置的属性都是放在类的__dict__里的。但类的__dict__并不包含其父类的属性。

>>> Student.__dict__

mappingproxy({'__module__': '__main__', 'country':'new paradise', '__init__': , 'setage': , 'getinfo': , '__dict__': , '__weakref__': , '__doc__': None})

>>> 

int,list, dict等这些常用的数据类型是没有__dict__属性的。

在继承关系中,子类和父类有各自的__dict__。

__module__

类定义所在的模块(如果类位于一个导入模块mymod中,那么className.__module__等于mymod,否则就是__main__)

__doc__

类的文档字符串。一般而言,是对函数/方法/模块所实现功能的简单描述,如果没有定义则为None。但当指向具体对象时,如每个函数都是一个对象,每个函数对象都有一个__doc__的属性,函数语句中,如果第一个表达式是一个string,这个函数的__doc__就是这个string,否则__doc__是None。

class new(object):

    '''whatsaying'''

    deffun(self):

        '''funtext'''

        pass

>>> new.__doc__

'what saying'

>>> new().fun.__doc__

'fun text'

>>> 

__str__&__repr__

__repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,其返回值是可读性较好的字符串类型,而__repr__面向python解释器的,其返回值表示解释器内部的含义。这两个函数分别由内置的str()\print()和repr()调用。在解释器中直接输入对象时默认调用repr()函数,而print则调用str()函数。

str([object]),返回一个可以用来表示对象的可打印的友好的字符串,对字符串,返回本身。没有参数,则返回空字符串 ,对类可通过 __str__() 成员控制其行为。

要改变一个实例的字符串表示,可重新定义它的__str__()和__repr__()方法。

 

>>>class Person(object):

...     def __init__(self, name, gender):

...         self.name = name

...         self.gender = gender

...

>>>p = Person('Bob', 'male')

>>>p

<__main__.Personobject at 0x2b1aa62417d0>

>>>print p

<__main__.Personobject at 0x2b1aa62417d0>

>>> 

>>>class Student(Person):

...     def __str__(self):

...             return '(Student: %s, %s)' %(self.name, self.gender)

...

>>>p = Student('Bob', 'male')

>>>

>>>p                                                   #调用__repr__()方法

<__main__.Studentobject at 0x2b1aa62419d0>

>>>print p                                               #调用自定义的__str__()方法

 

(Student:Bob, male)

>>> 

repr(object),返回一个可以用来表示对象的可打印字符串,首先,尝试生成这样一个字符串,将其传给 eval()可重新生成同样的对象, 否则生成用尖括号包住的字符串,包含类型名和额外的信息(比如地址) ,一个类(class)可以通过 __repr__() 成员来控制repr()函数作用在其实例上时的行为。

         一般来说,类中都应该定义__repr__()方法,而__str__()方法可选。但当可读性比准确性重要的时候,就应该考虑定义__str__()方法。如果类中没有定义__str__()方法,则默认使用__repr__()方法的结果来返回对象的字符串表示形式。

>>>class Teacher(Person):

...     def __repr__(self):

...             return '(Teacher: %s, %s)' %(self.name, self.gender)

...

>>>

>>>p = Teacher('Tom', 'female')

>>>p

(Teacher:Tom, female)

>>>print p

(Teacher:Tom, female)

>>> 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,459评论 0 6
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,718评论 0 10
  • Python内置函数详解——总结篇 ** 引 言** ** 数学运算** abs:求数值的绝对值>>> abs...
    yutiansut阅读 698评论 0 1
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,729评论 0 8
  • 内置函数Python解释器内置了许多功能和类型,总是可用的。他们是按字母顺序列在这里。 abs(x)返回一个数的绝...
    uangianlap阅读 1,223评论 0 0