1.对类的理解
class Province(object):
# 类属性
country = "中国"
def __init__(self,name):
# 实例属性
self.name = name
# 创建一个实例对象
obj = Province('山东省')
# 直接访问实例属性
print(obj.name)
# 直接访问类属性
Province.country
由上可知,【实例属性需要通过对象访问】,【类属性通过类名来访问】,在使用上实例属性和类属性的归属是不同的。(创建一个实例对象就相当于创建了一个新的内存空间,在创建对象时会调用__new__方法用来创建对象,__init__方法用来初始化实例对象。)
2.静态方法
- 实例方法:由对象调用,至少一个self参数,执行实例方法时,自动将调用该方法的对象赋值给self;
- 类方法:由类调用,至少一个cls参数,执行类方法时,自动将调用该方法的类赋值给cls;
- 静态方法:由类调用,无默认参数。
class Foo(object): def __init__(self,name): self.name = name def ord_func(self): '''定义实例方法,至少有一个self参数''' # print(self.name) print('实例方法') @classmethod def class_func(cls): '''定义类方法,至少有一个cls参数''' print('类方法') @statimethod def static_func(): '''定义静态方法,无默认参数''' print('静态方法') f = Foo("中国") # 调用实例方法 f.ord_func() # 调用类方法 FOO.class_func() # 调用静态方法 Foo.static_func()
问题:类方法与实例方法的区别在哪呢??
-
两者都是函数,当我们在一个类中想要修改类属性时,发现很难修改,我们想要使用obj.country = 'xxxx' 去修改类的属性时,实际上修改的修改的是实例对象中的实例属性,当我们定义一个实例对象时,没有定义实例属性,而去调用该属性时,Python解释器就会自动根据指定的这个属性,去寻找类属性中定义的该属性。而我们想要通过 obj.country = 'xxxx' 去修改类属性,实际上是为实例对象增加了一个实例属性。但是如果我们真的想要修改类属性时,通过 obj.__class__.country = "xxxx" 这种方式就能修改类属性。
-
在上述中,我们看到在类中想要修改类属性时,会十分的麻烦。那么,有没有好的方法帮组我们解决这个问题呢?这时候就需要借助于我们的类方法来实现上述的功能了,通过类方法我们就能直接的修改类属性了。
-
它们在对象的引用上也有很大的差别,我们在调用类方法时,将类对象的引用传递给类方法;调用实例方法时,将实例对象的引用传递给实例方法。
-
问题:那么静态方法有啥用呢?
它与类对象和实例对象无关,这个使用静态方法定义在类里的函数,其实也可以定义在类的外面,但是,当两个类定义了两个同名的函数,去修饰各自的类时,这时候就引发了一个问题,其中一个函数会被另外一个函数所覆盖。因此它的出现实际上就是防止在不同类中出现同名不同函数方法,而对另外一个同名函数进行覆盖,而将此函数定义在类中时,我们又不想解释器给我们默认的传类对象或实例对象的引用,这个时候我们就在该函数前使用 @staticmethod 。我们在类中调用这个不需要传参的方法:self.函数名() 。
注意:实例对象能有多个,类对象只能有一个。实例对象可以调用实例方法、类方法、静方法,类对象只能调用类方法、静态方法。