静态方法
静态方法的作用是可以更好的组织代码,防止代码变大后变得比较混乱。静态方法只是名义上归类管理,实际上在静态方法里访问不了类或则实例中的任何属性
静态方法使用场景
1)我们要写一个只在类中运行而不在实例中运行的方法.
2)经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法.
3)比如更改环境变量或者修改其他类的属性等能用到静态方法.
4)这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难.
调用方式
调用方式: 既可以被类直接调用,也可以通过实例调用 需要用 修饰器 @staticmethon 来标识, 无参数
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod
def eat():
print("I am a static method")
d = Dog("ChenRonghua")
d.eat() #方法1:使用实例调用
Dog.eat() #方法2:使用类直接调用
类方法
类方法:无需实例化直接被类调用 ,只能访问类变量,不能访问实例变量
类方法使用场景
类方法使用场景: 当我们还未创建实例,但是需要调用类中的方法
调用方式
调用方式: 既可以被类直接调用,也可以通过实例调用 需要用 修饰器 @classmethod 来标识
class Dog(object):
name = '类变量' #在这里如果不定义类变量仅定义实例变量依然报错
def __init__(self,name):
self.name = '实例变量'
self.name = name
@classmethod
def eat(self,food):
print("%s is eat %s"%(self.name,food))
Dog.eat('包子') # 方法1:使用类直接调用
d = Dog("ChenRonghua")
d.eat("包子") # 方法2:使用实例d调用
属性方法
属性方法把一个方法变成一个属性,隐藏了实现细节,调用时不必加括号直接d.eat即可调用self.eat()方法
需要用 修饰器 @property 来标识
class Dog(object):
def __init__(self, name):
self.name = name
@property
def eat(self):
print(" %s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat()
# 调用会出以下错误, 说NoneType is not callable, 因为eat此时已经变成一个静态属性了,
# 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了
魔法方法
type生成类调用顺序
__new__ : 先于__init__方法,每生成一个实例执行一次,__new__ 类方法创建实例对象
__init__ : __init__方法每生成一个实例就会执行一次,初始化实例对象
__call__ : 后与__init__方法,C()() 使用类再加一个括号调用, C为类名称
__del__ : 析构方法,删除无用的内存对象(当程序结束会自动自行析构方法)