python学习备忘
1. repr与str
class A:
def __init__(self, value):
self.m_value = value
def __str__(self):
return "str A %d" % (self.m_value)
def __repr__(self):
return "repr A %d" % (self.m_value)
a0 = A(0)
print str(a0)
print repr(a0)
a1 = A(1)
a2 = A(2)
a3 = A(3)
a4 = A(4)
i = [a0, a1, a2, a3, a4] #list 的 __str__调用了元素的__repr__?
print str(i)
print repr(i)
结果
str A 0
repr A 0
[repr A 0, repr A 1, repr A 2, repr A 3, repr A 4]
[repr A 0, repr A 1, repr A 2, repr A 3, repr A 4]
猜想结论(没有看python文档),python内置类型__str__方法只调用元素的__repr__方法
2.类和对象的属性及方法
class B:
__m_v2 = 2 #对象属性的一种定义方式,等价与在方法中定义self.__m_v2 = 2
def __init__(self):
print self
print self.__m_v2
def Fun0(self):
self.m_v0 = 0
def Fun1(self):
self.m_v1 = 1
def __Fun3(self):
self.m_v3 = 3
b0 = B()
b0.__init__() #专有函数(同时以__结尾),即使是以__开头,也可以直接从外界直接调用
print b0.Fun0
print b0.Fun1
b0.__Fun3() #__开头,私有成员函数,不得从外界直接调用
<__main__.B instance at 0x01A56580> #其实就是B的实例b0在内存中的位置0x01A56580
2
<__main__.B instance at 0x01A56580>
2
<bound method B.Fun0 of <__main__.B instance at 0x01A56580>>
<bound method B.Fun1 of <__main__.B instance at 0x01A56580>>
Traceback (most recent call last):
File "C:\Documents and Settings\XXXX\桌面\py\dv1.py", line 38, in <module>
b0.__Fun3()
AttributeError: B instance has no attribute '__Fun3'
3.关于值与引用的问题
class A:
def __init__(self):
self.m_v = 0
def SetValue(self, i):
self.m_v = i
def __str__(self):
return "A=%d" %(self.m_v)
i = [1,2,3]
k = i
i[0] = 5
print i
print k
a0 = A()
a1 = a0
a0.SetValue(5)
print a0
print a1
结果:
[5, 2, 3]
[5, 2, 3]
A=5
A=5
strings, tuples, 和numbers是按值改变的,而Dict,list,class是传引用的
4.关于函数修饰符
class A:
__m_vv = 0
s_k = 0
def __init__(self, i = 0, j = 0):
self.m_v = j
self.__m_vv = i
def SetValue(self, i):
self.m_v = i
def __str__(self):
return "A=%d m_vv=%d" %(self.m_v, self.__m_vv)
#def SetSValue(self, i):
# A.s_k = i
@staticmethod #修饰表示为静态成员函数,调用无需使用实例(self)
def SetSValue(i):
A.s_k = i
a0 = A(2,10)
a1 = A(3,11)
a0.SetSValue(5)
a0.SetSValue(6)
print a0
print a1
print a0.s_k
print a1.s_k
print A.s_k, 'A.s_k'
print a0.m_v
print a1.m_v
结果:
A=10 __m_vv=2
A=11 __m_vv=3
6
6
6 A.s_k
10
11
类变量是全局共享的,属于一个类型,而私有(__开头或者self定义的,__开头的变量不能从外界直接访问)都是属于对象的,还有很多@deco,可参看python文档
5.关于继承
好像只支持公有继承,多继承,子类不能访问基类的私有属性(变量和方法),而变量和方法查询按深度优先原则.