让优秀变成一种习惯

Python 实例化

上一篇 / 下一篇  2017-06-29 13:25:25 / 个人分类:学习

类和实例

类提供默认行为,是实例的工厂,工厂就是可以用同一个模子做出很多具体的产品来,累就是这个模子,实例就是具体的产品,所以实例是程序处理的实际对象。
类是由一些语句组成,但是实例,是通过调用类生产,每次调用一个类,就得到这个类的新的实例。
对于类的:class Person,class是一个可执行的语句,如果执行,就得到了一个类对象,并且将这个类对象赋值给对象名。

self的作用
第一个参数是self但是在实例化的时候,似乎没有这个参数什么事儿了,那么self是干什么的呢

slef是一个很神奇的参数
在Person实例化的过程中,数据'胡歌','boy',30,'Python','hege.io'通过构造函数(__init__)的参数已经存入到内存中,并且这个数据以Person类型的面貌存在组成一个对象,这个对象和变量info
建立的引用关系。这个过程也可说成这些数据附加到一个实例上。这样就能够以:object.attribute的形式,在程序中任何地方调用某个数据,例如上面的程序中以info.name得到'胡歌'.这种调用方式,在类和实例中经常使用,点号‘.’后面称之为类或者实例的属性

这个过程中,并且是在类的外面,如果在类的里面,想在某个地方使用传入的数据,怎么办

随着学习的深入,在类的内部,我们会写很多不同的功能的函数,这些函数在类里面有另外一个名称:方法。那么通过类的构造函数中的参数传入的这些数据也想在各个方法中被使用, 就需要在类中长久保存并能够
随时调用这些数据。为了解决这个问题,在类中,所有传入的数据都赋给一个变量,通常这个变量的名字是self,这是习惯而且是共识。
在构造函数中的第一个参数self,就是起到了这个作业-接收实例化过程中传入的所有数据,这些数据是通过构造函数后面的参数导入的。显然,self应该是一个实例,因为她所对应的就是具体数据。
class Person:
def __init__(self, name, sex, age, lang, website):
self.name = name
self.sex = sex
self.age = age
self.lang = lang
self.website = website


info = Person('胡歌', 'boy', 30, 'Python', 'hege.io') # 实例化Pesrson
print 'info.name=', info.name
print 'info.sex=', info.sex
print 'info.age=', info.age
print 'info.lang=', info.lang
print 'info.website=', info.website


def self(args):
pass

print self
print type(self)


加这几句之后,self就是一个实例(准确说是实例的引用变量)
self这个实例跟前面说的那个info所引用的实例对象一样,也有属性,那么接下来就规定其属性和属性对应的数据。上面代码中self.name=name
就是规定了self实例的一个属性,这个属性的名字也叫做name,这个属性的数据等于构造函数的参数那么所导入的数据,注意,self.name中的name和构造函数的参数name没有任何关系,他们两个一样,只不过是一种巧合(经常巧合)
或者说写代码的人懒惰,不想另外给他取名字,当然self.xxxx00 = name也是可以的

其实,从效果的角度来理解,可能更简单一些,那就是类的实例info对应着self,info通过self导入实例属性的所有数据。
当然,self的属性数据,也不一定非得是由参数传入的,也可以在构造函数中自己设定

class Person:
def __init__(self, name, sex, age, lang, website):
self.name = name
self.sex = sex
self.age = age
self.lang = lang
self.website = website
self.email = 'weizhenhua@kingsoft.com'#这个属性不是通过参数传入


info = Person('胡歌', 'boy', 30, 'Python', 'hege.io') # 实例化Pesrson
print 'info.name=', info.name
print 'info.sex=', info.sex
print 'info.age=', info.age
print 'info.lang=', info.lang
print 'info.website=', info.website
print 'info.email=',info.email#info通过self建立实例,并导入实例属性数据

def self(args):
pass

print self
print type(self)

通过这个例子,其实让我们拓展了对self的认识,也就是它不仅仅是为了在类内部传递参数导入的数据,还能在构造函数中,通过self.attribute的方式,规定self实例对象的属性,这个属性也是类实例化对象的属性
即做为类通过构造函数初始化后所具有的属性,所以在实例info中,通过info.email同样能够得到该属性的数据。在这里就可以把self形象地理解为内外兼修了。self主内,info主外

构造函数的参数
构造函数__init__就是一个函数,只不过长相有点古怪罢了,那么函数中的操作在构造函数中依然可行,
def __init__(self,*args)
pass
这种类型的参数,*args和前面讲述函数参数一样,很多时候并不是每次都要从外面传入数据,有时候会把构造函数的某些参数设置默认值,如果没有新的数据传入,就应用这些默认值

class Person:
def __init__(self, name, sex, age, lang, website):
self.name = name
self.sex = sex
self.age = age
self.lang = lang
self.website = website
self.email = 'weizhenhua@kingsoft.com'#这个属性不是通过参数传入

laoqi= Person('LaoQi',sex='girl',age=29,lang='Java',website='123@1')#导入一个数据name=‘LaoQi’,其他默认值
# info = Person('胡歌', sex='girl',age=29,lang= 'Python', website='hege.io')#全部重新导入数据

info = Person('胡歌', 'boy', 30, 'Python', 'hege.io') # 实例化Pesrson
print 'info.name=', info.name
print 'info.sex=', info.sex
print 'info.age=', info.age
print 'info.lang=', info.lang
print 'info.website=', info.website
print 'info.email=',info.email#info通过self建立实例,并导入实例属性数据

print 'laoqi.name=',laoqi.name
print 'laoqi.sex=', laoqi.sex
print 'laoqi.age=', laoqi.age
print 'laoqi.lang=',laoqi.lang
print 'laoqi.website=',laoqi.website

def self(args):
pass

print self
print type(self)

TAG:

引用 删除 xyp159   /   2017-06-30 09:29:17
3
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2019-04-09  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 6694
  • 日志数: 40
  • 建立时间: 2015-12-17
  • 更新时间: 2017-12-28

RSS订阅

Open Toolbar