属性参考设计

你好.
我想我知道如何在Python中解决属性访问.什么时候
引用类实例属性,该属性未定义
实例的范围,Python寻找一个与该类别的属性
一样的名字. (对于分配或删除,情况并非如此,
幸运的是.)
我一直在尝试理解为什么?背后的原因是什么,或
这个设计决定的实际目的?任何人,请启发
我.
/henrik

# 回答1


Chamalulu Schrieb:
您还将如何解决当然在
班级但在实例中调用?
diez
# 回答2


7月1日,晚上11:24," Diez B. Roggisch" 您还将如何解决当然在
班级但在实例中调用?
是的,当然...你是对的.
没想到.
谢谢你.我会站在拐角处. :)
我想我还没有从脑海中得到这种绑定/未绑定的东西.如果
我dir()一个类实例,我在那里看到了该方法.他们不是吗?
在Instanciation上绑定到类实例(因此
类实例的属性)?
/henrik
# 回答3


Chamalulu写道:
您还将如何解决当然在theclass上定义但通过实例调用的方法?
是的,当然...你是对的.
没想到.
谢谢你.我会站在拐角处. :)
没必要.另外,您可以定义类属性(C ++可能称其为
静态属性)并通过实例透明地访问它.
C类:
AclassAttribute = 123
def __init __(self,...):
...
C = C()
....用c.AclassAttribute ...
# 回答4


在7月2日,上午1:17,加里·赫伦(Gary Herron)
实际上,这就是为什么我也开始研究属性参考的原因
一开始的力学.我认为来自大多数C#开发
能够参考类属性(静态成员)很奇怪
通过类实例(对象).但是我想我得到了
图片.功能对象平坦在内存中(有些堆...).什么时候
定义在类中,它们包裹在方法对象中.什么时候
通过课程或课堂实例引用它们是未结合的方法
对象或界方法分别对象.我在正确的道路上吗?
我仍然不明白为什么当我dir()一堂课时会出现这些方法
实例.
/henrik
# 回答5


Chamalulu写道:
实际上,这就是为什么我也开始研究属性参考的原因
一开始的力学.我认为来自大多数C#开发
能够参考类属性(静态成员)很奇怪
通过类实例(对象).但是我想我得到了
图片.功能对象平坦在内存中(有些堆...).
不完全的.不是 *平坦的内存 *或堆.模块是头等舱
对象,函数(以及类别以及其他任何内容)
模块的最高级别是模块的 *属性 *.
加里·赫伦
# 回答6


Chamalulu aécrit:
实际上,这个 这就是为什么我也开始研究属性参考
一开始的力学.我认为来自大多数C#开发
能够参考类属性(静态成员)很奇怪
通过类实例(对象).但是我想我得到了
图片.功能对象平坦在内存中(有些堆...).
Python的功能是普通对象,类型为"函数"的实例.
没有.包装发生在查找时间,通过描述符协议
(提供对属性的支持的同一件事).
这就是函数.__获取__()返回,是的.班上存储的内容
对象的__ -dict__是普通函数.
"""
在模块中的内置功能dir __ builtin __:
dir(...)
dir([对象]) - 字符串清单
返回包含(某些)的名称的字母顺序列表
属性
给定对象的及其属性可从中触及:
没有参数:当前范围中的名称.
模块对象:模块属性.
类型或类对象:其属性,并递归
的属性
它的基础.
否则:它的属性,其类的属性和递归
该类基础类的属性.
""
# 回答7


在7月2日,上午10:13,布鲁诺·戴斯图里尔(Bruno Desthuilliers)<布鲁诺(Bruno).
42.desthuilli ...@werfeburburo.invalidwrote:
啊哈,我应该对此进行阅读.
因此,DIR功能比我提出的更有帮助.我
检查实例.__ dict __现在而不是dir(实例).没有方法.
越来越清楚.谢谢你.
我认为您为我提供了课堂实例的充分理由
如果类实例不
包含属性. Diez,Gary,Bruno;谢谢你的帮助.
/henrik
# 回答8


LE 2008年7月2日星期三01:17:21 Gary Herron,VousAvezécrit*:
是的,当然...你是对的.
没想到.
谢谢你.我会站在拐角处. :)

没必要.另外,您可以定义类属性(C ++可能称其为
静态属性)并通过实例透明地访问它.
C类:
AclassAttribute = 123
def __init __(self,...):
...
C = C()
...用c.AclassAttribute做点事...
要非常小心,因为它看起来像C ++或类似的其他OO语言,
但是,如果您为这样的一个值分配一个值,则Python以一种奇怪的方式处理它
属性.我花了很长时间才了解这里发生了什么:
类foo(对象):
bar = 0
foo = foo()
打印'(1)foo.bar:%d'%foo.bar
打印'(1)foo.bar:%d'%foo.bar
foo.bar += 1
打印'(2)foo.bar:%d'%foo.bar
打印'(2)foo.bar:%d'%foo.bar
foo.bar += 1
打印'(3)foo.bar:%d'%foo.bar
打印'(3)foo.bar:%d'%foo.bar
这是输出:
(1)foo.bar:0
(1)foo.bar:0
(2)foo.bar:1
(2)foo.bar:1
(3)foo.bar:1#嘿,伙计,我的酒吧在哪里?
(3)foo.bar:2
在第三种情况下,您可能会期望foo.bar += 1只是增加foo.bar,
但实际上不是.我首先认为这是一个错误,但事实并非如此.当你
写foo.bar + = 1(相当于foo.bar = foo.bar + 1),python首先外观
为了 条属性,在类成员中找到它,然后创建一个 实例成员具有结果. 可变的情况会有所不同 类型实现 +=运算符. 我在项目的中间发现了这一点,很难跟踪所有这些 我的代码中的作业以纠正它们,所以我建议始终访问课程 通过课程而不是实例的成员,除非您别无选择 或确切知道您在做什么. - - CédricLucantis

标签: python

添加新评论