python中class的def是什么_python中的“ __class__”属性到底是什么

小编典典

“从以上代码中,我认为NewCounter1.count等于NewCounter1。class.count”

问题是,在您的问题中此句子出现时,仅在以下说明之后:

NewCounter1 = counter()

NewCounter2 = counter()

NewCounter2.__class__.count = 3

创建了 NewCounter1 和 NewCounter2

并修改了类属性 counter.count之后 ,

不存在对象 NewCounter1.count 和 NewCounter2.count ,因此 “等于” 没有实际意义。

请在之后查看 NewCounter1 的创建:

class counter:

count = 0

def __init__(self):

self.__class__.count += 1

print 'counter.count BEFORE ==',counter.count # The result is 0

NewCounter1 = counter()

print '\nNewCounter1.__dict__ ==',NewCounter1.__dict__ # The result is {}

print 'NewCounter1.count ==',NewCounter1.count # The result is 1

print 'counter.count AFTER ==',counter.count # The result is 1

NewCounter._字典 _是实例的名称空间 NewCounter1

print NewCounter1.count 打印一样print counter.count

。然而,“计数”(字符串“数”)是不是在命名空间 NewCounter1 ,也就是说没有属性 数 在命名空间创建的实例!

这怎么可能 ?

这是因为没有assignement到“计数”标识内部创建实例的 _INIT _

- >有任何属性作为一个字段没有真正的创造 NewCounter1 ,也就是说没有创建实例属性。

结果是,在

print 'NewCounter1.count ==',NewCounter1.count

评估指令时,解释器不会在 NewCounter1 的名称空间中找到实例属性,然后转到该实例的类以在此类的名称空间中搜索键“

count”。在那里,它找到“ count”作为CLASS属性的键,并且可以将对象 counter.count

的VALUE作为要响应该指令显示的VALUE。

类实例具有一个实现为字典的名称空间,这是搜索属性引用的第一位。当在那里找不到属性,并且实例的类具有该名称的属性时,将继续使用类属性进行搜索。

http://docs.python.org/reference/datamodel.html#the-standard-type-

hierarchy

因此,NewCounter1.count equals

NewCounter1.__class__.count这意味着NewCounter1.count的VALUE即使该名确实不存在,也是类属性

NewCounter1 __的VALUE 。 .count 类 。这里的“是”是英语动词,不是该功能 是

测试两个对象的身份的语言,它的意思是“被认为具有”

当NewCounter2.__class__.count = 3被执行时,只有类属性 counter.count 受到影响。

NewCounter1 和 NewCounter2 的命名空间保持为空,并 遵循 相同的机制来访问类以找到

counter.count 的值。

最后,当NewCounter2.count = 5执行时,这一次将在INSTANCE属性 计数 中创建一个 NewCounter2

对象中的字段,并且“ count”出现在 NewCounter2 的命名空间中 。

它不会覆盖任何内容,因为实例中的内容之前__dict__

没有任何内容。其他更改不会影响 NewCounter1 和 counter.count

以下代码更明确地显示了执行期间的基础事件:

from itertools import islice

class counter:

count = 0

def __init__(self):

print (' | counter.count first == %d at %d\n'

' | self.count first == %d at %d')\

% (counter.count,id(counter.count),

self.count,id(self.count))

self.__class__.count += 1 # <<=====

print (' | counter.count second == %d at %d\n'

' | self.count second == %d at %d\n'

' | id(counter) == %d id(self) == %d')\

% (counter.count,id(counter.count),

self.count,id(self.count),

id(counter),id(self))

def display(*li):

it = iter(li)

for ch in it:

nn = (len(ch)-len(ch.lstrip('\n')))*'\n'

x = it.next()

print '%s == %s %s' % (ch,x,'' if '__dict__' in ch else 'at '+str(id(x)))

display('counter.count AT START',counter.count)

print ('\n\n----- C1 = counter() ------------------------')

C1 = counter()

display('C1.__dict__',C1.__dict__,

'C1.count ',C1.count,

'\ncounter.count ',counter.count)

print ('\n\n----- C2 = counter() ------------------------')

C2 = counter()

print (' -------------------------------------------')

display('C1.__dict__',C1.__dict__,

'C2.__dict__',C2.__dict__,

'C1.count ',C1.count,

'C2.count ',C2.count,

'C1.__class__.count',C1.__class__.count,

'C2.__class__.count',C2.__class__.count,

'\ncounter.count ',counter.count)

print '\n\n------- C2.__class__.count = 3 ------------------------\n'

C2.__class__.count = 3

display('C1.__dict__',C1.__dict__,

'C2.__dict__',C2.__dict__,

'C1.count ',C1.count,

'C2.count ',C2.count,

'C1.__class__.count',C1.__class__.count,

'C2.__class__.count',C2.__class__.count,

'\ncounter.count ',counter.count)

print '\n\n------- C2.count = 5 ------------------------\n'

C2.count = 5

display('C1.__dict__',C1.__dict__,

'C2.__dict__',C2.__dict__,

'C1.count ',C1.count,

'C2.count ',C2.count,

'C1.__class__.count',C1.__class__.count,

'C2.__class__.count',C2.__class__.count,

'\ncounter.count ',counter.count)

结果

counter.count AT START == 0 at 10021628

----- C1 = counter() ------------------------

| counter.count first == 0 at 10021628

| self.count first == 0 at 10021628

| counter.count second == 1 at 10021616

| self.count second == 1 at 10021616

| id(counter) == 11211248 id(self) == 18735712

C1.__dict__ == {}

C1.count == 1 at 10021616

counter.count == 1 at 10021616

----- C2 = counter() ------------------------

| counter.count first == 1 at 10021616

| self.count first == 1 at 10021616

| counter.count second == 2 at 10021604

| self.count second == 2 at 10021604

| id(counter) == 11211248 id(self) == 18736032

-------------------------------------------

C1.__dict__ == {}

C2.__dict__ == {}

C1.count == 2 at 10021604

C2.count == 2 at 10021604

C1.__class__.count == 2 at 10021604

C2.__class__.count == 2 at 10021604

counter.count == 2 at 10021604

------- C2.__class__.count = 3 ------------------------

C1.__dict__ == {}

C2.__dict__ == {}

C1.count == 3 at 10021592

C2.count == 3 at 10021592

C1.__class__.count == 3 at 10021592

C2.__class__.count == 3 at 10021592

counter.count == 3 at 10021592

------- C2.count = 5 ------------------------

C1.__dict__ == {}

C2.__dict__ == {'count': 5}

C1.count == 3 at 10021592

C2.count == 5 at 10021568

C1.__class__.count == 3 at 10021592

C2.__class__.count == 3 at 10021592

counter.count == 3 at 10021592

有趣的事情是

self.count = counter.count

在该行之前添加一条指令

self.__class__.count += 1 # <<=====

以观察结果的变化

综上所述,重点并不在乎,__class__而是一种搜索属性的机制,而这种机制在被忽略时会产生误导。

2020-12-20

### 回答1: `__getitem__` 方法是 Python的一个魔术方法,当使用类似于列表索引的方式访问类的实例时会触发这个方法。例如: ``` class MyClass: def __getitem__(self, index): # 此处可以实现类似列表的索引功能 obj = MyClass() print(obj[0]) ``` 在上面的代码,当我们调用 `obj[0]` 时,会触发 `MyClass` 类的 `__getitem__` 方法。 ### 回答2: 在Pythonclass是用于创建对象的蓝图或模板。__getitem__是class的一个特殊方法,用于定义对象的索引操作行为。 当我们在使用类创建对象时,可以通过类似于列表或字典的方式对对象进行索引操作。这时,如果我们在class定义了__getitem__方法,Python会自动调用这个方法来处理索引操作。 __getitem__方法接受一个参数,即索引值。我们可以在方法根据传入的索引值来返回对象特定索引位置的元素或属性。通常情况下,我们会在自定义的class通过__getitem__方法实现类似于列表的索引操作,使对象能够像列表一样被索引和访问其的元素。 例如,假设我们有一个自定义的类MyList,其包含一个属性list_data用于存储一组数据。如果我们想要通过索引来访问这些数据,可以在MyList类定义__getitem__方法。该方法可以接受一个参数index,然后返回list_data相应索引位置的元素。 示例代码如下: ``` class MyList: def __init__(self, data): self.list_data = data def __getitem__(self, index): return self.list_data[index] my_list = MyList([1, 2, 3, 4, 5]) print(my_list[0]) # 输出1 print(my_list[3]) # 输出4 ``` 通过定义__getitem__方法,我们使得MyList类的对象可以像列表一样使用索引操作,可以通过括号将对象的元素取出来。从而使得Pythonclass更加灵活和可扩展,能够满足不同需求。 ### 回答3: 在Pythonclass,__getitem__是一个特殊的方法,用于实现索引操作。当我们在一个对象上使用类似于obj[index]的索引操作时,实际上会调用该对象的__getitem__方法。 __getitem__方法接受一个参数index,它表示要获取的元素的索引位置。我们可以在这个方法自定义对索引操作的处理逻辑,并返回对应位置的元素。 通过在class定义__getitem__方法,我们可以让我们自己创建的对象能够支持索引操作,类似于列表或字典的使用方式。这样,我们就可以像操作列表一样,通过索引来访问这个对象内部的元素。 以下是一个示例: ```python class MyList: def __init__(self): self.data = [1, 2, 3, 4, 5] def __getitem__(self, index): return self.data[index] my_list = MyList() print(my_list[0]) # 输出:1 print(my_list[3]) # 输出:4 ``` 在上述示例,我们创建了一个名为MyList的类,并在类定义了__getitem__方法。该方法接受一个索引参数index,并返回指定位置的元素。 通过实例化这个类创建一个对象my_list后,我们可以使用索引操作来访问该对象的元素。通过调用my_list[0],我们可以获取存储在data属性索引为0的元素,即1。同样的道理,my_list[3]将返回4。 总而言之,__getitem__方法是Python的一个魔法方法,用于在自定义类实现索引操作,并返回指定位置的元素。它允许我们将自己定义的对象像列表或字典一样进行索引访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值