看《Python基础教程》,对于这个部分的描述不多,理解起来不透彻。
网上很多相关的讨论、理解,都很好!知乎上的这个讲解还是不错的,还有图,很棒!
这个年代的程序员(或者其他行业的人),想学一些技术知识真的太方便了,网上去找,一大把!知识共享,就看你学不学了!
下面这个link对于初学者来说非常好,值得仔细看看:
对于想深入理解的人,下面这个link更棒,里面含有例子,对比了@staticmethod和@classmethod的不同以及用法(例如:继承):
目前我能接受的理解,其实似懂非懂:
- Python里,类和实例都是对象。
这个对于写过C++的人来说,不太理解。好多人提到,在"静态语言"里(也就是C++一类),类的概念基本上是在编译的时候有意义。Python根本也没有编译期。
什么是动态语言?
随便找两个链接,其实,能把一个语言的优势发挥出来即可;了解一个语言的优势,以及适合做什么很重要。
http://haohetao.iteye.com/blog/589070
http://www.cnblogs.com/spmxlBlog/archive/2010/06/28/1766832.html
类和实例都是对象,那么他们肯定都有属于自己的变量,写了一个小例子:
-
class AA(object):
-
g=0 # 这是类的变量的定义
-
def __init__(self,val):
-
print "global g: ", g # 这是使用全局的变量,不是类的变量,也不是实例的变量,直接使用var 的方式
-
if val > AA.g: # 这是使用类的变量,需要用 class.var 的方式使用
-
self.g=val # 这是使用实例的变量,在类里面,就用 self.var 的方式使用;在类外面就用 obj.var 的方式调用
-
else:
-
self.g=AA.g
-
-
g=111 # 全局变量的定义
-
print "AA.g: ", AA.g
-
aa1=AA(10)
-
aa2=AA(20)
-
print "aa1.val: ", aa1.g
-
print "aa2.val: ", aa2.g
-
-
print "---------------"
-
AA.g=100
-
print "AA.g: ", AA.g
-
aa3=AA(10)
-
aa4=AA(20)
-
print "aa3.val: ", aa3.g
-
print "aa4.val: ", aa4.g
结果是:
-
AA.g: 0
-
global g: 111
-
global g: 111
-
aa1.val: 10
-
aa2.val: 20
-
---------------
-
AA.g: 100
-
global g: 111
-
global g: 111
-
aa3.val: 100
-
aa4.val: 100
@staticmethod
- 可以引用哪些变量?
可以使用全局变量,或者本类的类变量;不能使用本类的对象的变量。
- 如何调用该方法?
可以用类名来调用:class.method()
也可以用类的实例来调用:obj.method()
# 没想明白为什么可以这么调用
也可以用实例找到类,进而调用:obj.__class__.method()
-
class AA(object):
-
def __init__(self):
-
print "--- init ----"
-
@staticmethod
-
def printme(oo):
-
print "this is: ", oo, type(oo)
-
-
aa = AA()
-
-
aa.printme(1)
-
aa.__class__.printme('2')
-
AA.printme(3.3)
输出:
-
--- init ----
-
this is: 1
-
this is: 2
-
this is: 3.3
@classmethod
-
class AA(object):
-
def __init__(self):
-
print "--- init ----"
-
@classmethod # 跟上一个例子的区别 1
-
def printme(cls,oo): # 跟上一个例子的区别 2
-
print "this is: ", oo, type(oo)
-
-
aa = AA()
-
-
aa.printme(1) # 把aa作为第一个参数传递了进去,但是"printme"的"cls"是怎么解析的呢?
-
aa.__class__.printme('2') # 把谁作为第一个阐述传递进去的?没想明白
-
AA.printme(3.3) # 把AA作为第一个参数传递进去的
输出结果,跟@staticmethod的输出是一模一样的!
那为什么要用@staticmethod方法,而不是用类以外的全局方法呢?
个人理解(可能有问题,欢迎指出问题):
@staticmethod是定义在类里面的,那么这个类就是他的命名空间。
比如说,有两个类Class_A和Class_B,假定:因为某种需求,在使用的时候,他们都需要判断一些环境变量是否定义了。
用普通的方法(没有绑定类),那么就得用到 isinstanceof 这个一般都不太建议用到的函数,因为不利于代码的扩展:
-
def check_env(oo):
-
if oo isinstanceof Class_A:
-
...
-
else if oo isinstanceof Class_B:
-
...
-
else
用@staticmethod,那么就可以在各自的类里面进行定义了。
对于这个简单的例子,用@classmethod也是可以的。
阅读(1882) | 评论(0) | 转发(0) |