实例属性:
和具体某个实例对象有关系,并且一个实例对象和另一个实例对象是不共享属性的
类属性:
类属性所属于类对象,并且多个实例对象之间共享同一个类属性
- 实例方法:
class Foo(object):
def __init__(self, name): # 定义了实例方法
# 实例属性
self.name = name
print("object")
对象和类都可以调用,类调用需传递n个参数,对象调用只能传n-1个参数,对象调用时第一个参数默认为对象本身self。
- 类方法
classmethod
:
class Foo(object):
@classmethod
def test2(cls): # 定义了类方法
print("class")
对象和类都可以调用,第一个参数默认是类型cls,传入的都是类对象,主要用于工厂方法,具体的实现就交给子类处理。
调用时第一个参数忽略,只需要传n-1个参数
类方法中的cls是类本身,调用方法时传的值也必须是类的公有属性,
也就是说类方法只能操作类本身的公有字段。
- 静态方法
@staticmethod
:
class Foo(object):
@staticmethod
def test3(): # 定义了静态方法
print("static")
用对象对象名.方法名
和类类名.方法名
都可以调用,但不会给默认参数,需要传n个参数。
用静态方法,通过类直接调用时,可不需要创建对象,不会隐式传递self
class A(object):
def foo(self, x):
print('executing foo(%s,%s)' % (self, x))
@classmethod
def class_foo(cls, x):
print('executing class_foo(%s,%s)' % (cls, x))
@staticmethod
def static_foo(x):
print('executing static_foo(%s)' % x)
a = A()
a.foo(1) # 通过类创建的对象去调用
A.class_foo(1) # 类名调用
a.class_foo(1) # 对象调用
A.static_foo(1) # 类名调用
a.static_foo(1) # 对象调用
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
一般建议:对于类方法和实例方法,第一个参数带有特殊性,就应该类方法就只能类型调用,实例方法就只能实例调用,因为其它方式调用的时候,第一个参数的传递就带有一定的风险。`