对象的属性

首先要理解的是“实例变量”。

我们在__init__方法中并不是创建了实例变量,我们是添加了一个或者多个属性给实际的对象

在__init__内部 self.x = 5和外部 f.x = 5没有什么不同。

 

那么类呢?

1 >>> class Bar(object):
2     pass
3 
4 >>> Bar.foo = 100
5 >>> Bar.foo
6 100
7 >>> Bar
8 <class '__main__.Bar'>

类也是对象,所以它也有属性。但是有一个疑问。我们可以为每一个实例对象定义一个属性通过__init__方法。

那创建一个类的属性,是怎么样的?

答案很简单。函数内部的代码块和类的代码块。函数的内部代码只有当函数触发是才会执行,类的代码块是在类定义好后就执行的,只执行一次

1 >>> class Foo():
2     print("hello")
3 
4     
5 hello
6 >>> 
1 >>> class Foo():
2     x = 100
3 
4     
5 >>> Foo.x
6 100

 

如果我们定义了一个函数,我只是在当前作用域创建了一个变量,如果在类里面定义一个方法,其实是创建了一个新的属性

1 >>> class Foo():
2     def blah(self):
3         return "blash"
4 
5     
6 >>> Foo.blah
7 <unbound method Foo.blash>

 

换句话说,实例的方法在类里面,不在实例对象上,当我们触发f.blah()时,相当于这样f.blah()和Foo.blah(f)

 

如果我触发f.blah(),python怎么知道去触发Foo.blah?  f和Foo是完全两个不同的对象。f是Foo的实例对象,Foo是type的实例对象,python是如何找到Foo的blah属性的呢?

 

python有不同的规则用于变量和属性区域,对于变量,python遵守LEGB规则:本地,闭合,全局,内建。

对于属性,首先它会在对象上寻找,然后再去寻找这个对象的类,然后去寻找这个类的父类。知道寻找到object类

因此f.blah(),先找实例对象f,没有找到属性名blah,去找这个类Foo,在这里找到了然后通过一些方法执行Foo.blah(f)

 

所以python没有实际上的类变量和实例变量之分。有的只是对象的属性。一些事定义在类本身上。一些是建立在类的实例对象上。(当然,类也是type的实例对象,现在往我们忘记它)。这也是为什么一些人认为他们应该定义类上的属性(类变量)。因为它们对实例对象时可见的。

 

最后来看一下代码

 1 >>> class Person():
 2     population = 0
 3     def __init__(self, f, s):
 4         self.f = f
 5         self.s = s
 6         self.population +=1
 7 
 8         
 9 >>> p1 = Person('s','ss')
10 >>> p2 = Person('a', 'aa')
11 >>> p1.population
12 1
13 >>> p1.population
14 1
15 >>> p2.population
16 1
17 >>> Person.population
18 0

 

转载于:https://www.cnblogs.com/jypwn/p/4033941.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hibernate.session.get()方法不能获取表中最新数据解决方式样例

1.A a (A)session.get(A.class, id); sess.createSQLQuery("update A set name where id ").executeUpdate(); A a1 (A)session.get(A.class, id);//a1中获取不到修改后的name值 sess.refresh(a1);//刷新a1对象&#xff0c;取出数据库数据 注&#xff1a;hibern…

hibernate 映射_Hibernate映射集合性能问题

hibernate 映射首先&#xff0c;本文的灵感来自于Burt Beckwith在2011年1月27日于SpringOne 2GX上发表的有关高级GORM –性能&#xff0c;自定义和监视的演讲 。 简而言之&#xff0c; Burt Beckwith讨论了使用映射集合和GORM中的Hibernate 2级缓存的潜在性能问题&#xff0c;以…

SEL selector (二)

SEL消息机制工作原理是什么 引用下面文章&#xff1a; 我们在之前有提到,一个类就像一个 C 结构.NSObject 声明了一个成员变量: isa. 由于 NSObject 是所有类的根类,所以所有的对象都会有一个 isa 的成员变量[公共继承].而该 isa 变量指向该对象的类(图3.15)[类在Objective-C中…

Ext grid 根据行号获取行数据

var storeExt.getCmp(grid_id).store;// var storerowstore.getAt(row_num);//行数据 var phonenumberstorerow.get(phonenumber);//列信息 //------------------------------------------------------------------------- var dataExt.getCmp(grid_id).store.data; var d…

mobile cpu上禁用alpha test的相关总结

因为&#xff0c;每家芯片的特性不同&#xff0c;根据向framebuffer写法的不同&#xff0c;分为tile-based的mobile cpu&#xff0c;如ImgTec PowerVR&#xff0c;ARM Mali&#xff0c;一部分老版本Qualcomm Adreno。还有标准的direct&#xff08;immediate&#xff09;的mobil…

学习笔记_jquery(js)遍历页面标签

$(#selectTable tr).each(function(i){ // 遍历 tr $(this).children(td).each(function(j){ // 遍历td var id $(this).context.id; }); }); //---------------------- $("input[namename1]").each(function(){ //遍历name…

简易分享功能(非第三方)

在做一个新项目时&#xff0c;需要一个新浪和微信的分享功能&#xff0c;起初看到这个需求&#xff0c;感觉没有什么&#xff0c;直接使用第三方比较成熟的分享组件就可以的&#xff0c;比如&#xff1a;jiathis、百度分享组件&#xff0c;这些都可以很轻松并且方便的完成所需要…

达梦定时迁移数据

1. 生成迁移源代码 1.1 启动DM迁移工具&#xff08;bin/dts.exe&#xff09; 1.2 右击迁移管理空白处 -> 新建工程 1.3 展开工程 -> 右击迁移&#xff0c;新建迁移 -> 输入迁移名称&#xff0c;确认 1.4 右击迁移名称&#xff0c;打开 -> 输入源数据库连接信息&…

JSP教程–最终指南

编者注&#xff1a; JavaServer Pages&#xff08;JSP&#xff09;技术使您可以轻松创建同时包含静态和动态组件的Web内容。 JSP技术提供了Java Servlet技术的所有动态功能&#xff0c;但提供了一种更自然的方法来创建静态内容。 JSP技术的主要功能包括用于开发JSP页面的语言&…

CRC校验(转)

CRC即循环冗余校验码&#xff08;Cyclic Redundancy Check[1] &#xff09;&#xff1a;是数据通信领域中最常用的一种差错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#xff09;是一种数据传输检错功能&#xff0c;对数据…

tongweb6数据源使用中时常报空异常处理方式

1.在tongweb控制台 -> jdbc配置中设置数据源参数 1.1 勾选空闲超时&#xff0c;时间默认 1.2 勾选泄露超时时间 &#xff0c;时间为半天&#xff08;14400&#xff09; 1.3 勾选连接有效性检查、创建连接验证、获取连接验证、归还连接验证 图中设置泄露超时时间为900…

Ios tab Bar 使用方法

http://blog.sina.com.cn/s/blog_63578f140100w56m.html UITabBar* tabBar [[UITabBar alloc] initWithFrame:CGRectMake(40,0.0,240,30)]; [mainView addSubview:tabBar]; [tabBar release]; UITabBarItem *tabBarItem1 [[UITabBarItem alloc] initWithTitle:"排队人数…

spring smtp_使用Spring使用Java发送电子邮件– GMail SMTP服务器示例

spring smtp对于使用Java发送电子邮件&#xff0c; JavaMail API是标准解决方案。 如官方网页所述&#xff0c;“ JavaMail API提供了独立于平台和协议的框架来构建邮件和消息传递应用程序”。 必需的类包含在JavaEE平台中&#xff0c;但是要在独立的JavaSE应用程序中使用它&am…

关闭uboot MMU 会导致android2.3 S5pv210 系统不稳定?!why

问题描述在uboot里面屏蔽了MMU 使能//#define CONFIG_ENABLE_MMU就导致android 2.3 在S5pv210 上不稳定了&#xff0c;如果没屏蔽就稳定很多&#xff0c;why&#xff1f;&#xff01;坑爹的人啊&#xff0c;问了一些做了几年linux和android的人说没影响的&#xff0c;啥玩意啊&…

Java 9中的5个功能将改变您开发软件的方式(还有2个不会)

有望在Java 9中发布的最令人兴奋的功能是什么&#xff1f; 不要对Java 9的相对沉默近来分散注意力。JDK提交者正在努力准备下一个版本&#xff0c;该版本预计将在2015年12月完成&#xff0c;而功能将在几个月后完成 。此后&#xff0c;它将通过严格的测试和错误修复了将其计划…

eclipse远程tomcat javaweb debug样例(windows)

1.tomcat配置可被远程debug端口参数 catalina.bat 中添加 set CATALINA_OPTS-Xdebug -agentlib:jdwptransportdt_socket,servery,suspendn,address8000 导出项目war包到tomcat/webapps/目录下 切换到tomcat/bin目录下 双击startup.bat启动运行项目 2.eclipse中启动远程debug…

总账分录追溯发票或者付款

--总账分录追溯发票 SELECT DISTINCT AIA.*FROM AP_AE_HEADERS_ALL AAH, --帐户分录头表AP_AE_LINES_ALL AAL, --账户分录行表&#xff0c;每一个会计事件都会在此表中产生会计分录GL_JE_BATCHES GJB,GL_JE_HEADERS GJH,GL_JE_LINES GJL,AP_INVOICES_ALL …

mysqlDM判断字符串中是否存在非中文

MYSQL判断字符串是否全中文 正则表达式匹配[一-龥]中文字符[ a-zA-Z]英文字母[ 0-9]数字[ぁ-ゞァ-ヾ]日文字符1.查询存在非中文的记录 &#xff1a;select * from tablename where columnname REGEXP [^一-龥]; 2.查询存在中文的记录&#xff1a;select * from columnname wh…

ASP.NET MVC的ContentResult

ASP.NET MVC的ContentResult返回简单的纯文本内容&#xff0c;可通过ContentType属性指定应答文档类型&#xff0c;通过ContentEncoding属性指定应答文档的字符编码。一个例子来演习&#xff0c;自定义一个RwResult&#xff0c;它继承ContentResult&#xff0c;为视图象ASP.NET…

windows搜索指定目录下包含某个字符串的文件

1.打开cmd窗口 &#xff1a;winr 快捷键-> 输入cmd 回车 2.切换到被搜索的文件夹&#xff08;E:\shgwy文档\日常\更新\20220808&#xff09;下 如输入&#xff1a; cd E:\shgwy文档\日常\更新\20220808 e: 3.输入搜索命令 c:\Windows\System32\findstr.exe /s /i "wa…