Python学习小节1

来源:互联网 发布:mac充电器怎么拆 编辑:程序博客网 时间:2024/05/22 05:16

一. 在方法中更改类变量属性的值是危险的,这样会影响根据这个类定义的所有对象的这一属性。
      关于这一句,情况是这样的:
1、对象不能修改类的属性,只能修改自己的,也就是说,修改了之后对同类的其他对象没有影响;
2、动态修改类属性可以用类名.属性 = xxx来进行修改;
3、修改的类属性一般会影响所辖对象的属性,除非对象在此之前对该属性进行过修改。

        当类变量属性都是immutable的(比如整数、字符串)时,在方法中更改类变量属性的值是可行的,因为在更改对象属性时,该属性会被复制出一个副本,存放在对象的__dict__中;但如果属性是mutable的话(比如list),在更改属性值时,就不会有新的副本,更改会被所有的对象看到,进而影响根据这个类定义的所有对象的这一属性。

例:

class Human(object):
    Age = 0
    Name = ['li','zhang']
a = Human()
b = Human()
a.Age += 1
print a.Age
print b.Age

a.Name[0] = 'wang'
print a.Name
print b.Name
print a.__class__.__dict__ #可以通过此方式查看
print a.__class__

输出结果:

1
0
['wang', 'zhang']
['wang', 'zhang']
{'__module__': '__main__', 'Name': ['wang', 'zhang'], 'Age': 0, '__dict__': <attribute '__dict__' of 'Human' objects>, '__weakref__': <attribute '__weakref__' of 'Human' objects>, '__doc__': None}
<class '__main__.Human'>


     可以通过下面的方式查看:
            print a.__class__.__dict__
            print a.__dict__
     注意到类和对象中各有一个Age:一个0, 一个1。所以我们在查找a.Age的时候,会先查到对象的__dict__的值,也就是1。

     所以,在Python中,为了避免混淆,最好总是区分类属性和对象的属性,使用__init__初始化对象属性值,而不能依赖上述的immutable属性的复制机制。


. superList([1,2,3])和superList([3,4])应该都是superList这个类的对象,那么[1,2,3][3,4]应该是两个对象分别传入进去的b值才对啊,为什么[1,2,3]是self,而[3,4]是b呢

class superlist(list):
    def __sub__(self,b):
        a = self[:]
        b = b[:]
        while len(b) > 0:
            element_b = b.pop()
            if element_b in a:
                a.remove(element_b)
        return a
print superlist([1,2,3]) -superlist([3,4])


superList([1,2,3])和superList([3,4])是创建superList对象的,比如
>>> l1 = superList([1, 2, 3])
>>> l2 = superList([3, 4])
并不会调用__sub__方法,并不涉及b

只有在下面减法时,才会调用__sub__
>>> l1 - l2
这时相当于
>>> l1.__sub__(l2)
所以,l1是self, l2是b

>>> l1 - l2的时候为什么是>>> l1.__sub__(l2)呢?
他是怎么将“-”识别为__sub__的呢?这个问题挺深的。这个叫做operator overloading,是由Python解释器完成的。
 

原创粉丝点击