好久没更新博客了,近段时间工作太忙,今天和大家一起学习下python中的类方法,类属性,实例对象,实例属性以及被classmehtod和staticmethod装饰器装饰过的方法
1:首先我们知道在定义了类之后,会产生类属性以及类方法,有时在类中还可能定义私有属性,所以对于非私有属性的类属性以及类方法,我们可以使用类对象.类属性或使用实例对象来调用类方法
先上一段代码,我们分析下
class Dog(object):
money=1000
def __init__(self,name,age):
self.name=name
self.age=age
self.number=200
def eat(self):
print('吃')
def food(self,food):
return '我要吃{}'.format(food)
@classmethod
def run(cls):
print('我走了{}米'.format(cls.money))
@staticmethod
def walk():
print('hello world')
d=Dog('张三',18)
d.eat()#这是使用实例对象来调用类方法
d.run()#其实实例对象也能调用被classmethod装饰的类方法
print(d.money)
print(Dog.money)
Dog.run()#这是使用类对象来调用类方法
d.walk()
Dog.walk()
输出分别是:
吃
我走了1000米
1000
1000
我走了1000米
------>
静态方法调用的结果
hello world
hello world
class Person(object):
money = 20000
@classmethod
def test(cls):
# print('我是test,xx=={}'.format(cls))
# print('money = {}'.format(cls.money))
print('我是类方法的test')
def test(self):
print('我是实例对象方法的test')
@staticmethod
def test():
print('我是静态方法的test')
p = Person()
p.test()
由上面得出
a:类属性可以通过类对象以及实例对象来访问
b:类属性只能通过类对象来修改,不能通过实例对象来修改
b-1:如果类中定义了类属性以及实例属性的名字一样时,优先调用实例属性的方法
c:使用classmethod来修饰类方法后,对于类方法中的cls,所指的就是类对象
c-1:同时类方法可以被类对象以及实例对象来调用,(一般类方法建议被类对象来调用)
d:使用staticmethod来修饰类方法后,对于静态方法的调用,可以使用类对象以及实例对象
e:类中的私有属性,以及私有方法只能在类的内部使用,不能被实例对象以及类对象在类外边直接调用
f:如果定义了三种函数名字一样的方法。分别是类方法,实例方法,静态方法,那么,在被实例对象调用时,调用最后的方法