类方法,静态方法


#7.静态方法与类方法

#按参数区分

# 实例方法
#
# 定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);
#
# 调用:只能由实例对象调用。


# 静态方法
#
# 定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;
# 可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。
#
# 调用:实例对象和类对象都可以调用。
import time
class TimeTest(object):
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
@staticmethod#用这个标记的,就是静态方法,无需传参self,可以用类直接调用
def showTime():
return time.strftime("%H:%M:%S", time.localtime())
#静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,
# 但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。
print(TimeTest.showTime())
t = TimeTest(2, 10, 10)
nowTime = t.showTime()#静态方法由类和对象都可以调用
print(nowTime)


# 类方法
#
# 定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,
# 通过它来传递类的属性和方法(不能传实例的属性和方法);
#
# 原则上,类方法是将类本身作为对象进行操作的方法。假设有个方法,且这个方法在逻辑上采用类本身作为对象来调用更合理,
# 那么这个方法就可以定义为类方法。另外,如果需要继承,也可以定义为类方法。
# 调用:实例对象和类对象都可以调用


class ClassTest(object):
__num = 0
@classmethod
def addNum(cls):
cls.__num += 1
@classmethod
def getNum(cls):
return cls.__num
# 这里我用到魔术函数__new__,主要是为了在创建实例的时候调用人数累加的函数。
def __new__(self):
ClassTest.addNum()
return super(ClassTest, self).__new__(self)
class Student(ClassTest):
def __init__(self):
self.name =''

a = Student()
b = Student()
print(ClassTest.getNum())
#https://www.jb51.net/article/147544.htm

相关