范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Python名称空间

  一、类的实例化
  调用类 ====>产生类的对象,该对象也可以成为类的一个实例,调用类的过程也称为类的实例化class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("%s is learning" % self)     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male")
  最后一行代码就是类的实例化,那么这行代码做了哪些事,我们再来回顾下先造一个空对象obj,和所有对象都一样连同这个对象和三个参数一块传递给init函数执行DeepshareStudent.__init__(obj,"王二小",18,"male")二、名称空间
  我们可以使用类名加.dict方法,查看类的名称空间,那么对象的名称空间能不能查看呢?class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name  # 把name这个属性放进对象的名称空间中         self.age = age         self.gender = gender     def learn(self):         print("%s is learning" % self)     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") print(stu1.__dict__)
  在定义类的阶段产生类的名称空间,那么什么时候产生对象的名称空间呢?你要先告诉我什么时候产生对象,只有在调用类的时候才会产生对象,这个时候就会产生出对象的名称空间,有了名称空间就是把对象存好了,但是存不是目的,我们目的是取  print(stu1.__dict__["name"])
  毫无疑问,这样肯定是可以的,但是我们还有更好的方法print(stu1.name)
  现在我们定义的类做一下修改class DeepshareStudent:     school = "deepshare"     name = "aaaaaaaaaa"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("%s is learning" % self)     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male")
  现在有两个name,我再执行以下代码,打印的结果是什么呢print(stu1.name)
  很明显我用对象找他的独有的name属性 就应该从init中找name
  但是,如果init函数中没有呢?print(stu1.school)
  这个对象stu1会先从他自己对象的名称空间中找school这个属性,但是他发现没有这个属性,那就后退一级,往类的名称空间中找,注意对象的名称空间和类的名称空间不是一个概念,接下来我们会说明这个问题
  如果类的名称空间中没有,他还会往上找吗?school = "deepshare" class DeepshareStudent:     name = "aaaaaaaaaa"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("%s is learning" % self)     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") print(stu1.school)
  肯定是不能的,写代码的时候Pycharm就会有错误的提示了,现在school是定义在全局,与对象stu1没有任何关系
  我们再来看一下代码class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("%s is learning" % self)     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") stu2 = DeepshareStudent("王三小",18,"male") print(DeepshareStudent.__dict__) print(id(DeepshareStudent.__dict__)) print(stu1.__dict__) print(id(stu1.__dict__)) print(id(stu2.__dict__))
  我现在造了两个对象stu1和stu2,打印结果可以说明,他们分别有自己的内存空间,类也有自己的内存空间,那么这之间有什么关系呢?
  他们三部分是完全独立的,没有包含与被包含的关系,只不过用对象点属性做属性查找的时候先从对象的名称空间中查找,如果能够找到,就是使用对象的名称空间存的,如果找不到就取类的名称空间中找,再找不到就要报错了,错误提示:对象没有这个属性三、绑定方法
  前面我们研究是对象的特征(用变量表示的,接下来我们来研究对象的技能(用函数来表示的),不管是特征还是技能这些都是对象的属性,这是我们前面已经证明过的,那么接下来我们就来调用对象的属性  class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("%s is learning" % self)     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") stu2 = DeepshareStudent("王三小",18,"male") print(DeepshareStudent.learn) print(stu1.learn) print(stu2.learn) print(id(DeepshareStudent.school)) print(id(stu1.school)) print(id(stu2.school))
  我们再来理解一下,类是直接从自己的名称空间中拿到learn属性,而对象在自己的名称空间中找learn属性没有找到,就要到类的名称空间中去找,相当于是间接拿到了learn属性。类内部定义的函数自己能使用,但主要是给对象用的。再来看一下内存地址,上面三个函数属性的内存地址是完全不同的,而下面三个变量属性的内存地址是完全一样的。这是因为类内部的变量是直接给对象使用,而类内部的函数是绑定给对象使用,这怎么理解呢
  你们大家都是Deepshare的学生,都有一个相似的技能叫做学习,但是你学习能学到小明身上了,你学习并不能代表小明学习,虽然你们都具有学习的功能。这就叫绑定方法,大家用的是同一个功能,但是绑定给谁,就是谁在执行
  那么这在程序中怎么体现呢?class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("is learning")     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") stu2 = DeepshareStudent("王三小",18,"male") DeepshareStudent.learn("albert") stu1.learn()
  执行代码,我们会发现,类调用learn方法必须要传一个参数,而stu1调用learn方法不需要传参数,但是learn确实是需要一个参数的,那就说明他是自动传了一个参数,我们怎么验证呢?class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("is learning",self)  # 打印一下self就知道了     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") stu2 = DeepshareStudent("王三小",18,"male") DeepshareStudent.learn("albert") stu1.learn() print(stu1)
  仔细看看是不是一样的
  这就说明stu1调用learn方法本质原理就是把它自己传进来stu1.learn()  # DeepshareStudent.learn(stu1)
  这就是绑定方法,类内部定义的函数,类可以使用,但是类来使用的时候就是一个普通函数,普通函数有几个参数就传几个参数print(DeepshareStudent.learn) DeepshareStudent.learn("albert")
  但是类内部定义的函数其实是为了给对象用的,而且是绑定给对象用的,绑定给不同的对象,就是不同的绑定方法print(stu1.learn) print(stu2.learn)
  绑定方法的特殊之处在于谁来调用,就会把谁当作第一个参数自动传入class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("is learning",self)     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") stu2 = DeepshareStudent("王三小",18,"male") stu1.learn() stu2.learn()
  接下来我们单独用stu1来说明class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender          # self=stu1     def learn(self):         print("%s is learning" % self.name)  # self就是stu1,stu1有name方法     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") stu2 = DeepshareStudent("王三小",18,"male") stu1.learn() stu2.learn()
  综上所述
  类内部的变量是给所有对象共享,所有对象指向的都是同一个内存地址; 类内部定义的函数其实是为了给对象用的,而且是绑定给对象用的,绑定给不同的对象,就是不同的绑定方法
  类内部定义的函数必须要有self这个参数,但也可以有别的参数class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("%s is learning" % self.name)     def choose(self,course):  # 在添加一个函数         print("%s is choosing %s" %(self.name, course))  # 传一个course参数     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") stu2 = DeepshareStudent("王三小",18,"male") stu1.choose("Python")  # 传一个实参 stu2.choose("AI")四、一切皆对象
  在Python中有一个一切皆对象的说法,面向对象讲到这里我们就可以解释了class DeepshareStudent:     school = "deepshare"     def __init__(self,name,age,gender):         self.name = name         self.age = age         self.gender = gender     def learn(self):         print("%s is learning" % self.name)     def choose(self,course):         print("%s is choosing %s" %(self.name, course))     def eat(self):         print("is eating")     def sleep(self):         print("is sleeping") stu1 = DeepshareStudent("王二小",18,"male") stu2 = DeepshareStudent("王三小",18,"male") print(stu1) print(type(stu1)) print(id(stu1))

2023啦关于跨年。其实现在已经十一点了,但我一个字也没憋出来。所以我来到了厕所,谢谢厕所,简直是我废话输出的源泉。主题按理其实早该定好了,但感觉要写的东西和之后的会有点重叠,所以现在在尝试星河长明,辞旧迎新时光的花絮,飞舞在雪花的纯净里。心灵的渴盼,绽放在鲜艳的祝福中。冬深雪冷,无法阻挡亲人浓烈的思念,一票难寻,无法改变游子返乡的决心。神圣的除夕,唤回无数美丽的童心,打开无数难忘的画FW三方重磅交易方案!湖人将获得顶级锋线,威少或重回华盛顿洛杉矶湖人队目前战绩排在西部第十三,但他们最终还是有很大机会在常规赛结束时进入季后赛,因为他们距离西部第六只有四个胜场的差距。所以许多球迷都呼吁管理层在交易截止日之前进行交易补强。CBA半程违体榜杜润旺许钟豪李炎哲领衔,广厦队多达3人入选CBA前两个阶段已经告一段落,本土数据榜全面出炉,王哲林成为得分王篮板王,独霸奖项数据,孙铭徽成为助攻王,刘铮成为抢断王,小将余嘉豪是盖帽王,除了五大主要数据之外,一些其他数据统计早知道切尔西冬窗引援花费超2亿欧元北京时间21日凌晨,切尔西官方宣布,从埃因霍温签下年轻边锋马杜克,双方签约至2030年,外加一年续约选项。据此前记者罗马诺消息,这笔交易的转会费为3500万欧元。值得一提的是,马杜男篮最意外的3人入选,广东3连冠功臣被低估,江苏黑马还不如徐杰男篮最意外的3人入选,广东三连冠功臣周鹏跟胡明轩最意外,江苏的黑马却让人争议不断,为何徐杰姜伟泽却落选名单了呢?谈到这个问题,我们主要从3个方面跟大家认真聊一聊,你就清楚新一届的选让一部分人先看懂2023快充迈入个位数时代然后呢?手机中国2023年,注定不会平凡。至今,席卷全球的新冠疫情已持续三年,在这三年的时间里,它改变了我们太多太多。或许很多人都还未完全适应疫情下封控的生活,便要在2023迎来新一轮的改但愿第五窗口期不会重演经过乔大爷的物色和选择,中国男篮世预赛第六窗口期集训名单终于出炉。从名单来看,应该是基本按照乔帅之前的要求来选择了,即职业的素养和正确的态度(这条估计没异议),年轻化高大化,防守能NBA老照片从台前到幕后科比81分你错过了哪些细节?就在时间线刚刚跨入到2023年的第三天,继科比布莱恩特和德文布克之后,又一位来自首轮十三顺位的得分后卫完成了单场得分70的壮举休赛期刚刚加盟骑士的多诺万米切尔狂砍71分,不仅帮助克张伟丽能打几个男人?邱建良是这么说的自从张伟丽夺得UFC冠军之后,张伟丽可以打几个男人类似的问题,已经可以和李小龙特种兵这样的热门话题相提并论,今天我们来看看专业运动员的观点。中国踢拳名将邱建良对此发表了自己的看法,你可能涉黄了?大数据扫黄将开启,符合以下特征的需留意随着互联网近几十年的发展,网上的消息传播速度越来越快,信息量也变得越来越大了。当然也有很多人利用互联网的功能去满足一些自己的欲望。诚然,生理需求是每个人必有的。很多人为了满足自己的
今西部NBA之群像今之西部NBA,诸侯混乱,豪俊不立,霸主落寞,小弱恒弱。湖人威风扫地,依赖老迈詹皇,苦撑世族门庭虽有俊才浓眉,奈何体恙志衰神龟蛰伏,主家聩昏,难见复苏之兆。勇士不勇,赖萌神岁长,疾女足天花板!23岁美女加盟大连,笑靥如花纤腰美腿,完胜网红明星女足在世界足坛发展十分迅速,尤其是国内近些年成绩崛起,加上足协也在扶持,所以女足的关注度变得越来越高。目前为止已经有多达10多名女足球员留洋海外,成为亚洲范围内留洋球员最多的女足队英超赛场闹元宵,豫园灯会携东方生活美学海外出圈北京时间2月4日23时,英格兰伍尔弗汉普顿市,莫利纽足球场,11名球童手持火遍全网的豫园新春灯会兔子灯,和身着印有元宵快乐祝福语出场服的英超狼队球员,一起昂首走向球场中央。旋即,复邓肯的微笑与詹姆斯的呼天抢地被裁判针对,邓肯说第二,没人敢说第一!NBA历史第一大前锋邓肯,就因为两次微笑,被裁判判了两个技术犯规,驱逐出场,这个应该就是大家都熟知的。邓肯2007年邓肯率领的马刺VS诺维茨基NBA每日战报速览2月5日大家好!今天是2月5日星期天,元宵佳节,祝大家元宵快乐,阖家团圆!来看NBA战况,今天一共进行了9场NBA常规赛,结果如下1奇才(123)篮网(125)本场比赛,奇才重演被逆转的悲为国征战15年,换来的却是失败的领袖易建联的性格注定做不了领袖,但他是一个非常好任劳任怨的二当家,打法也是一个终结者,有点像太阳的小斯,需要一个好的后卫带着。只不过姚明那代退役后,其他人太差了。否则也不用一个老将1957岁巩俐让世界见证东方之美!一袭旗袍惊艳国际红毯,给国人长脸裙子千千万,只有新的最好看。确实这也是裙装对于女性诱惑大的原因。随着新中式风的兴起,女性们又开始痴迷于新中式。配色好看,设计简约的新中式适合多数人,也更容易烘托个人气质。无论是红高小胸怎么穿抹胸款婚纱礼服抹胸婚纱的款式既可以性感又可以甜美,肩颈线得到完美地诠释。但是没有肩带的支撑,小胸的女生穿上很容易滑落。那么小胸怎么穿抹胸礼服呢?黎贝拉小编分享几种方法,一起来看!一平胸穿抹胸礼服(Di)vision创意惊艳秀场,餐台布也成时装近日,哥本哈根的时装品牌(Di)vision举办了一场晚宴派对,展示自己的2023秋冬系列。派对接近尾声时,高潮突起,隐于人群中模特而离开座位,竟然把餐枱布一同帶离,观众惊觉原来台湖州恒大珺睿府业主新期待!湖州恒大珺睿府最令人瞩目的莫过于紧邻西山漾湿地公园,这是被誉为湖州唯一能和西湖媲美的湖。总投资20亿!西山漾又添一座矿坑运动乐园!矿坑运动乐园酒店项目吴兴交旅投与上海华昌企业(集团年味就是对美好生活最纯的期待我想,每一个年,买上一只称心如意的土鸡,是一种仪式感和习惯。从小时候开始,对于年的记忆,就与从母亲备年货开始。而除了一些腌制食品,年二十九,年三十的菜场头,选购上一只称心如意的土鸡