2. Python3 中的静态方法与类成员方法

在开始具体的代码验证之前,提出我的主观理解结论:

  • 静态(static)的概念是限定类成员(属性变量,成员方法)的作用域,和C++的static声明有相同之处
  • Python类中没有static的关键字。python实现上,没有self限定的变量和方法都是“静态的”,带self的就是普通的类成员。
  • 所以python的静态与C++中的静态有较大区别,类和对象都能读取静态变量,而对象不能读取静态方法(参数错误,调用时多了一个self参数)。静态变量的赋值很奇怪!如果对象未对静态变量赋值,则类和对象分享相同变量地址(类赋值也会改变对象的值,同c++static机理);如果对象从新绑定静态变量,类中的值不受影响。

代码验证如下

>>> class test():
...     value = 0
...     def func():
...         print("I am the class function")
... 
>>> a = test()
>>> b = test()
>>> print(test.value,a.value,b.value)
0 0 0
>>> a.value = 1
>>> print(test.value,a.value,b.value)
0 1 0
>>> print(id(test.value),id(a.value),id(b.value))
10914400 10914368 10914400 # 注意, a的值地址单独变化
>>> test.value = 2
>>> print(test.value,a.value,b.value)
2 1 2
>>> print(id(test.value),id(a.value),id(b.value))
10914432 10914368 10914432 # 注意b和test的值地址是同时变化
>>> def func():
...     print('I am the global function')
... 
>>> test.func()
I am the class function
>>> a.func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes 0 positional arguments but 1 was given
>>> test.func = func
>>> test.func()
I am the global function
>>> a.func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes 0 positional arguments but 1 was given

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,241评论 30 472
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 1,399评论 0 3
  • 重点掌握 3 类对象和方法 对象就是一个物体 类的独特存在就是一个实例,对实例进行操作叫做方法。方法可以应用于类或...
    Coder大雄阅读 1,288评论 0 2
  • 像賞花一樣,去享受漢字書法帶來的愉悅!
    飛雪飄香阅读 110评论 0 2
  • 意识到自己读书速度太慢,读书方法有问题的时间其实挺久的了。 我一直标榜自己喜欢读书,周围所有人也都知道我喜欢读书,...
    yimy201314阅读 277评论 0 0