在版本号为.2的情况之下, 静态方法与类方法是被进行引用的, 不管是经典类还是新式类, 都是可以直接被使用的。与此同时, 存在一对内建函数, 是分别被称为和被的这两个内建函数被引入到了进来, 它们的作用是用于把一个类之中的某种方法进行转化, 从而把其转化为上述这两种方法当中的一个。
静态方法:
静态方法指的是那种定义在类的内部, 并且不需要依赖于具体的实例就能直接进行调用的函数。
这类方法主要是被用来存放具有逻辑性质的代码, 也就是说, 那些虽然从概念上属于这个类的一部分, 但实际上跟类本身并没有发生直接或间接交互的逻辑关系, 体现在具体的执行过程当中, 就是在这些静态方法里面, 是不会去涉及到对类当中所定义的方法以及属性进行任何操作的行为的。
如果我们从一个比较直观的角度去理解的话, 那就可以把静态方法看作是完全存放在以类名为名称的空间里面的一个存在物。而事实上, 在我们的编程实践里, 如果还没有引入静态方法这一概念的时期, 人们通常是选择在全局名称空间中创建函数来完成类似的事情。
例子:
比如说, 我想要去定义一个类, 这个类是关于时间操作方面的, 而在这个类里面有这样一个函数, 就是用来获取当前时间的。
brush:python;gutter:true;
import time
class TimeTest(object):
def init(self,hour,minute,second):
self.hour = hour
self.minute = minute
self.second = second
@staticmethod
def showTime():
return time.strftime("%H:%M:%S", time.localtime())
print TimeTest.showTime()
t = TimeTest(2,10,10)
nowTime = t.showTime()
print nowTime
上面所说的那样,采用静态函数这种方式, 既可以起到把用来获取那个时间的函数的具体功能, 跟具体的对象实例进行分离绑定的作用, 我想要去拿到关于当前那个时间的字符串内容的时候, 其实并不一定非得要去创建一个对象的实例来用, 在这样的一个时候, 这个概念或者这种用法, 实际上更像是在充当一个名称空间的这个角色。
我们可以在类的外面写一个简单的方法来做这些, 但是这样做就扩散了类代码的关系到类定义外面去, 这样写就会导致以后代码维护困难。
静态函数是可以通过类名来调用的, 同时也是可以通过实例来调用的。
所谓的类方法这个概念。
所谓的类方法, 其核心含义就是指把类自身视作一个操作对象来进行处理的手段。
它跟咱们所说的静态方式之间存在着一定程度的差别, 该差别体现在无论使用者是通过创建出来的具体实例来进行调用, 还是直接通过类本身去调用, 这种方式在底层实现时, 总是会自动拿出第一个参数作为传入的对象, 而这个对象正是该类本身。
@ means: when this is , we pass the class as the first of the of that class (as we do with ). This means you can use the class and its that than a .
@ means: when this is , we don't pass an of the class to it (as we do with ). This means you can put a a class but you can't the of that class (this is when your does not use the ).
应用:
1、做一个颜色的动态匹配
brush:python;gutter:true;
class ColorTest(object):
color = "color"
@classmethod
def value(self):
return self.color
class Red(ColorTest):
color = "red"
class Green(ColorTest):
color = "green"
g = Green()
print g.value()
print Green.value()
在这其中, 基类要做成一件事儿, 就是把抽象出来的共性给搞定, 至于那个实际的颜色值是什么, 那就需要结合着实际的类去进行一个匹配。
2、现在有一个假设的情况, 就是存在一个用来描述学生信息的类, 还存在一个用来描述班级信息的类, 而目前打算要去完成的功能目标则是:
班级类含有类方法:

执行增加班级人数的操作, 并获得班级的总人数。
学生这个类是从班级那个类继承过来的, 每当一个学生被实例化出来的时候, 班级的总人数就能够增加。
在最后阶段呢, 我们要去选定并定义一批特定的学生对象, 而后通过这种方式来获取并且确认班级里头的总数量人数到底是多少这个事。
关于这个思路的思考认为, 选择使用类方法来进行处理是比较合适的做法。原因是当我进行实例化的时候, 创建的对象是学生个体的例子。然而, 如果打算通过这一个叫做学生的具体实例去获取班级里面的总人数, 这种做法在逻辑上是不合理的。
与此同时, 假如你打算去弄到班级里面的那个总人数的数据, 要是专门去搞出一个针对单个班级的实例出来, 这个操作其实是不需要去做的。
brush:python;gutter:true;
class ClassTest(object):
__num = 0
@classmethod
def addNum(self):
self.__num += 1
@classmethod
def getNum(self):
return self.__num
def new(self):
ClassTest.addNum()
return super(ClassTest,self).new(self)
class Student(ClassTest):
def init(self):
self.name = ''
a = Student()
b = Student()
ClassTest.getNum()
我这里是使用魔术函数的, 主要是想通过在创建实例的时候, 把调用人数进行累加的函数给执行一下。
类函数可以通过类名来加以调用, 同时也可以借助于实例来进行操作。
注意:
在当中, 必须总要把一个方法声明为静态的, 这样就能够不带一个实例而调动它。
如果在代码的上下文中, 某个方法仅仅只需要通过类本身来进行调用, 而完全没有任何必要去通过创建出来的实例对象去调用它的话, 那么在这种情况下, 是不用一定非要把它声明成静态的。
brush:python;gutter:true;
#!/usr/bin/python
class test:
def show():
print ("show")
test.show()
在这个时间点, 错误是会出现的:
root@ home
./test.py
大多数人都会觉得这是最后的机会, 所以都把最后的力气使出来。
在test.py这个文件里头, 来到了第六行那儿。
test.show()
: show() must be with test as first (got )
改到即可:
brush:python;gutter:true;
#!/usr/bin/python3
class test:
def show():
print ("show")
test.show()