*实例--对象的创建

如果说类是一种数据结构定义类型,那么实例则声明了一个这种类型的变量。#实例是那些主要用在运行期时的对象,类被实例化得到实例,该实例的类型就是这个被实例化的类。## 4.1 初始化:通过调用类对象来创建实例#实例化的实现,可以使用函数操作符:#class c1(object):# def showName(self,name):# print('name is:',name)#c3=c1()## 4.2 __init__() "构造器"方法#当类被调用,实例化的第一步是创建实例对象。一旦对象创建了,Py

thon 检查是否实现了__init__()方法。#默认情况下,如果没有定义(或覆盖)特殊方法__init__(),对实例不会施加任何特别的操作.任何所需的特定操作,#都需要程序员实现__init__(),覆盖它的默认行为。如果__init__()没有实现,则返回它的对象,实例化过程完毕。##然而,如果__init__()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递#进去,像标准方法调用一样。调用类时,传进的任何参数都交给了__init__()。实际中,你可以想#像成这样:把创建实例的调用当成是对构造器的调用。#__init__()是很多为类定义的特殊方法之一。其中一些特殊方法是预定义的,缺省情况下,不#进行任何操作,比如__init__(),要定制,就必须对它进行重载,还有些方法,可能要按需要去实现.## 4.3 __new__() “构造器”方法#与__init__()相比,__new__()方法更像一个真正的构造器。Python 用户可以对内建类型进行派生,#因此,需要一种途径来实例化不可变对象,比如,派生字符串,数字,等等#在这种情况下,解释器则调用类的__new__()方法,一个静态方法,并且传入的参数是在类实例#化操作时生成的。__new__()会调用父类的__new__()来创建对象(向上代理)。#__new__()必须返回一个合法的实例,这样解释器在调用__init__()时,就可以把这个实例作为self 传给它。调用父类的__new__()#来创建对象,正像其它语言中使用new 关键字一样。__new__()和__init__()在类创建时,都传入了(相同)参数。## 4.4 __del__() "解构器"方法#由于Python 具有垃圾对象回收机制(靠引用计数),这个函数要直到该实例对象所有的引用都被清除掉后才会执行。#Python 中的解构器是在实例释放前提供特殊处理功能的方法,它们通常没有被实现,因为实例很少被显式释放。#核心笔记:跟踪实例#Python 没有提供任何内部机制来跟踪一个类有多少个实例被创建了,或者记录这些实例是些什#么东西。如果需要这些功能,你可以显式加入一些代码到类定义或者__init__()和__del__()中去。#最好的方式是使用一个静态成员来记录实例的个数。靠保存它们的引用来跟踪实例对象是很危险的,#因为你必须合理管理这些引用,不然,你的引用可能没办法释放(因为还有其它的引用)!看下面一个例子:#class InstCt(object):# count = 0 # count is class attr count 是一个类属性# def __init__(self): # increment count 增加count# InstCt.count += 1# def __del__(self): # decrement count 减少count# InstCt.count -= 1# def howMany(self): # return count 返回count# print(InstCt.count) ##c1=InstCt()#c2=InstCt()##c1.howMany()#c2.howMany()#c1.__del__()#c2.howMany()#-->#2#2#1#*********** Part 5:

实例属性 ***********************#实例仅拥有数据属性(方法严格来说是类属性),后者只是与某个类的实例相关联的数据值,并#且可以通过句点属性标识法来访问。这些值独立于其它实例或类。当一个实例被释放后,它的属性同时也被清除了。## 5.1 “实例化”实例属性(或创建一个更好的构造器)#设置实例的属性可以在实例创建后任意时间进行,也可以在能够访问实例的代码中进行。构造器__init()__是设置这些属性的关键点之一。####在构造器中首先设置实例属性#构造器是最早可以设置实例属性的地方,因为__init__()是实例创建后第一个被调用的方法。#再没有比这更早的可以设置实例属性的机会了。一旦__init__()执行完毕,返回实例对象,即完成了实例化过程。####默认参数提供默认的实例安装#在实际应用中,带默认参数的__init__()提供一个有效的方式来初始化实例。在很多情况下,#默认值表示设置实例属性的最常见的情况,如果提供了默认值,我们就没必要显式给构造器传值了。#需要明白一点,默认参数应当是不变的对象;像列表(list)和字典(dictionary)这样的可变对象可以扮演静态数据,#然后在每个方法调用中来维护它们的内容。#class c1(object):# def __init__(self,name,sex='man'):# print('name:%s,sex:%s' %(name,sex))#c2=c1('dave')#-->name:dave,sex:man#注意:__init__()应当返回None#你也知道,采用函数操作符调用类对象会创建一个类实例,也就是说这样一种调用过程返回的对象就是实例。#如果定义了构造器,它不应当返回任何对象,因为实例对象是自动在实例化调用后返回的。相#应地,__init__()就不应当返回任何对象(应当为None);否则,就可能出现冲突,因为只能返回实例。#class c1(object):# def __init__(self,name,sex='man'):# print('name:%s,sex:%s' %(name,sex))# return 1#c2=c1('dave')#-->TypeError: __init__() should return None, not 'int'## 5.2 查看实例属性#可是使用dir() 或者类的__dict__属性查看。 这个在3.3 节有示例。## 5.3 特殊的实例属性#实例仅有两个特殊属性。对于任意对象I:# I.__class__ 实例化I 的类# I.__dict__ I 的属性#class C(object): # define class 定义类# pass##c = C() # create instance 创建实例#print(dir(c)) # instance has no attributes 实例还没有属性#print(c.__dict__) # yep, definitely no attributes 也没有属性#print(c.__class__) # class that instantiated us 实例化c 的类#-->#[]#{}##c 现在还没有数据属性,添加一些再来检查__dict__属性,看是否添加成功了:#c.foo = 1#c.bar = 'SPAM'#print(c.__dict__)#-->#{'foo': 1, 'bar': 'SPAM'}#dict__属性由一个字典组成,包含一个实例的所有属性。键是属性名,

值是属性相应的数据值。字典中仅有实例属性,没有类属性或特殊属性。## 5.4 内建类型属性#内建类型也是类,对内建类型也可以使用dir(),与任何其它对象一样,可以得到一个包含它属性名字的列表:#x = 3+0.14j#print(x.__class__)#-->#print(dir(x))#-->['__abs__', '__add__', '__bool__', '__class__', '__delattr__', '__divmod__', '__doc__', '__eq__', # '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', # '__hash__', '__init__', '__int__', '__le__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', # '__new__', '__pos__', '__pow__', '__radd__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', # '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', # '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', 'conjugate', 'imag', 'real']#print(x.imag)#-->0.14#在内建类型中,不存在__dict__属性:#print(x.__dict__)#-->AttributeError: 'complex' object has no attribute '__dict__'## 5.5 实例属性 vs 类属性#类属性仅是与类相关的数据值,和实例属性不同,类属性和实例无关。这些值像静态成员那样被引用,即使在多次实例化中调用类,#它们的值都保持不变。不管如何,静态成员不会因为实例而改变它们的值,除非实例中显式改变它#们的值。(实例属性与类属性的比较,类似于自动变量和静态变量,但这只是笼统的类推。#类和实例都是名字空间。类是类属性的名字空间,实例则是实例属性的。###访问类属性#类属性可通过类或实例来访问.###从实例中访问类属性须谨慎#与通常Python 变量一样,任何对实例属性的赋值都会创建一个实例属性(如果不存在的话)并#且对其赋值。如果类属性中存在同名的属性,有趣的副作用即产生。###类属性持久性#静态成员,如其名所言,任凭整个实例(及其属性)的如何进展,它都不理不采(因此独立于#实例)。同时,当一个实例在类属性被修改后才创建,那么更新的值就将生效。类属性的修改会影响#到所有的实例

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

推荐阅读更多精彩内容