类方法
特点:
1。定义需要依赖类装饰器@classmethod
2.类方法中的参数不是一个对象,而是当前类
print(cls) <class ‘main.Dog’>
3.在类方法中只可以使用类属性,不能访问self属性 之所以是这种情况 是因为类属性先于对象属性创建,这时候对象属性还没有创建
4.类方法不依赖对象,Dog.test()这样写也可以 但是Dog.run()不可以
5.类方法不可调用普通方法
6.类方法的用处 因为只能访问类属性和类方法,所以可以在对象创建之前,如果需要做一些功能或动作,就可以用类方法
静态方法 静态方法和类方法都依赖Person()的调用 不能用对象调用
静态方法:很类似类方法
1.需要装饰器@staticmethod
静态方法是无需传递参数的 cls,self都不能出现在静态方法中
他只能访问类的属性和方法,对象是无法访问的
加载时机:同类方法 只要类被创建,就会存储下
总结: 类方法 静态方法
不同:
1.装饰器不同
2.类方法是有参数的,静态方法没有参数
相同:
1、只能访问类的属性和方法,对象的是无法访问的 调用静态方法 : Person.static
2.都可以通过类名调用访问 Person.static()
3都可以在创建对象之前使用,因为是不依赖与对象
普通方法 与两者的区别:
不同:
1.没有装饰器
2.普通方法永远是要依赖对象,因为每个普通方法都有一个self
3.只有创建了对象才可以调用普通方法,否则无法调用
// # 类方法
# 特点:
# 1。定义需要依赖类装饰器@classmethod
# 2.类方法中的参数不是一个对象,而是当前类
# print(cls) <class '__main__.Dog'>
# 3.在类方法中只可以使用类属性,不能访问self属性 之所以是这种情况 是因为类属性先于对象属性创建,这时候对象属性还没有创建
# 4.类方法不依赖对象,Dog.test()这样写也可以 但是Dog.run()不可以
# 5.类方法不可调用普通方法
# 6.类方法的用处 因为只能访问类属性和类方法,所以可以在对象创建之前,如果需要做一些功能或动作,就可以用类方法
class Dog:
name='小黄狗' #类属性
def __init__(self,name):
self.name=name
def run(self): #普通方法必须依赖self对象而存在 但类方法不需要对象就可以调用
print('{}在院子里跑来跑去!'.format(self.name))
def eat(self):
print("吃饭啦--------------")
self.run() #调用同级普通方法时 需要self.普通方法
#cls.test() 同理 是不被允许的 普通方法不可调用狗类方法
@classmethod #调用装饰器声明此方法为类方法
def test(cls): #cls是class的简写,传入的对象必须为Dog类
print(cls)
print(cls.name)
#self.run() 是不被允许的 类方法不可同级调用普通方法
d=Dog('大黄狗') #对象创建一个与class一模一样的地址,将参数传入init
d.run() #对象调用def self方法没有问题
d.test() #对象调用类方法 类方法中有一个cls.name 继承类中类属性name'小黄狗' 而不是调用def普通方法中的name
print('-------------------以下为补充----------------------')
#补充类方法
class Person:
print('Person开始被执行')
age='18'
__name='小红'
def show(self):
print('-----------',Person.age)
@classmethod
def test(cls):
print('------>类方法,先调用未修改过的私有属性')
print(cls.__name)
@classmethod
def update_age(cls):
cls.__name='小粉'
print('--------->类方法,已执行cls.__name 将私有属性修改了')
print(cls.__name)
# 静态方法 静态方法和类方法都依赖Person()的调用 不能用对象调用
# 静态方法:很类似类方法
# 1.需要装饰器@staticmethod
# 静态方法是无需传递参数的 cls,self都不能出现在静态方法中
# 他只能访问类的属性和方法,对象是无法访问的
# 加载时机:同类方法 只要类被创建,就会存储下
# 总结: 类方法 静态方法
# 不同:
# 1.装饰器不同
# 2.类方法是有参数的,静态方法没有参数
#
# 相同:
# 1、只能访问类的属性和方法,对象的是无法访问的 调用静态方法 : Person.static
# 2.都可以通过类名调用访问 Person.static()
# 3都可以在创建对象之前使用,因为是不依赖与对象
#
# 普通方法 与两者的区别:
# 不同:
# 1.没有装饰器
# 2.普通方法永远是要依赖对象,因为每个普通方法都有一个self
# 3.只有创建了对象才可以调用普通方法,否则无法调用
@staticmethod
def static2():
return ('------------>静态方法只能调用静态方法--------')
@staticmethod
def static1():
print('------------>静态方法')
print(Person.__name)
print(Person.static2()) #静态方法调用静态方法
Person() #只会输出类中不是方法的那些代码 print('Person开始被执行')
Person.test()
Person.update_age()
Person.test() #这时候再调用类属性,因为前边已被修改过 所以输出新的值
Person.static1()
print('------------------以下为介绍外部不能修改私有属性--------------------')
p=Person()
p.show()
#我需要改age,但不是通过p.age的方法 不创建对象就想改类属性
#现在有一个需求 程序已加载,现在已经过了一年了,原来是18岁,现在是19岁,默认他自动加一岁,不能通过对象改(p.age=p.age+1)
#不依赖对象就改类属性,就用这种方法:Person.age=Pareson.age+1 ,但是这种方法不是私有化方法,会被别人控制
#不想被控制 就用私有方法 __age 是一个私有方法 不能通过Person.__age 这是报错的
# Person.__name='小名' #但是我在外部先定义一个Person.__name的话 不报错 如果直接调Person.__name报错
# print(Person.__name)
结果如下
大黄狗在院子里跑来跑去!
<class '__main__.Dog'>
小黄狗
-------------------以下为补充----------------------
Person开始被执行
------>类方法,先调用未修改过的私有属性
小红
--------->类方法,已执行cls.__name 将私有属性修改了
小粉
------>类方法,先调用未修改过的私有属性
小粉
------------>静态方法
小粉
------------>静态方法只能调用静态方法--------
------------------以下为介绍外部不能修改私有属性--------------------
----------- 18
转载另一位大神的博客 他写了静态方法类方法的使用场景
链接: [link]https://www.cnblogs.com/mrwuzs/p/10899498.html