• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
String Of Brilliant Blue
湛蓝之弦
博客园    首页    新随笔    联系   管理     

python学习备忘

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.关于继承

好像只支持公有继承,多继承,子类不能访问基类的私有属性(变量和方法),而变量和方法查询按深度优先原则.

posted @ 2008-08-04 14:56  effulgent  阅读(1252)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3