@classmethod
有的时候在类中会有一种状况,就是这个方法并不须要使用每个对象属性
所以 这个方法中的self
参数一个彻底无用的参数,使用classmethod
python
class A: __count = 0 # 隐藏类count属性 def __init__(self, name): self.name = name self.__add_count() # 每一次实例化的时候掉 # 用私有方法来对__count 进行累加 @classmethod def __add_count(cls): # 定义一个私有方法 print(cls, A) A.__count += 1 # 让这个方法只能在类的内部被使用 @classmethod def show_count(cls): # 被classmethod 装饰去的方法, print(cls.__count) return A.__count # 让用户能够从外部查看__count的值 def show_count_self(self): # 定义一个普通方法 # print(self.__count) print(self) # print('_____') # print(self.show_count(),'fogogo') # return A.__count # 让用户能够从外部查看__count的值 # show_count 是一个查看类中属性的方法,这样的方法和某一个对象并无直接联系 obj = A('baozi') print(A._A__add_count) # # 执行结果 <class '__main__.A'> <class '__main__.A'> <bound method A.__add_count of <class '__main__.A'>>
本质上 :函数
@classmethod
code
一个方法不用对象属性可是使用静态属性 -- 类方法@classmethod
某一个方法被创造出来,就是为了进行对静态变量进行操做对象
@staticmehtod
get
根本不涉及到对象,因此这个方法就应该被定义成 类方法(被@classmethod
装饰)
调用这个类方法,可使用对象调用,也可使用类调用
可是这个方法的默认参数永远是当前类的命名空间,而不是对象的it
@staticmethod
若是一个类中的方法不用 对象属性 也不用 静态属性 -- 静态方法@staticmethod
table
那实际上这个方法就是一个普通的函数class
class User(object): @staticmethod def login(arg1, arg2):#是User类中的名字函数的名字login就是一个类中的静态方法,本质上就是一个函数 return (arg1 + arg2) def show(self): print('---->show') print('---self--',self.login(1, 3)) print('class--',User.login(123, 31)) print(User.login(1,2)) ## 不须要实例化,当函数使用 print(User().show()) # 执行结果 3 ---->show ---self-- 4 class-- 154
一个不须要用到对象命名空间中的变量的方法,就不是一个对象方法,就应该是一个普通的函数变量
类是直接在本身的空间找到类 类这个方法object
对象先在本身的空间找,找不到,就到类的空间找
classmethod
staticmethod
使用场景说明:self
只要用self
就是普通方法,只能用对象调
Classmethod
只要cls 就是类方法,能够用类,能够用对象
Staticmethod
啥用不用 就是静态方法 ,能够用类,能够用对象
普通的方法 | 类方法 | 静态方法 | |
---|---|---|---|
默认参数 | self |
cls | 无 |
操做变量 | 操做对象属性 | 操做静态属性 | 既不操做对象属性,也不操做类的属性 |
所属的命名空间 | 类 | 类 | 类 |
调用方式 | 对象 | 类/对象 | 类/对象 |
对应的装饰器 | 无 | @classmethod | @staticmethod |
@property
把一个方法假装成属性,
下面例子中计算圆面积的公式
class Cirecle: def __init__(self, r): self.r = r @property def area(self): # 被property 装饰器 装饰的方法不能传递 除self之外参数 return pi * self.r ** 2 def perimeter(self): return self.r * pi * 2 c1 = Cirecle(5) print(c1.area) # 打印执行结果 78.53981633974483
某一个属性须要被私有,可是有须要能够被外部查看, 这种状况,把这个属性经过方法,`property 假装成属性
class Person: def __init__(self, name): self.__name = name # 不让外面随便修改 @property def get_name(self): return self.__name ari = Person('arimiage') print(ari.get_name) # 执行结果 arimiage
Property 修改属性值
@funcname.setter
@funcname.deleter
class Person: def __init__(self, name): self.__name = name @property def name(self): return self.__name @name.setter # 只能传一个参数。以前必须有一个同名的方法被property装饰过 def name(self, new_name): if isinstance(new_name, str): # if type(new_name) is str: self.__name = new_name #setattr装饰的函数名叫什么 #那么这个函数中绝对不能够对这个,函数名同名属性进行修改( 函数名) @name.deleter def name(self): print('gogoog') del self.__name #这里才执行删除属性操做 def get_name(self): return self.__name # def set_name(self,new_name): # if type(new_name) is str: # if isinstance(new_name,str): # self.__name == new_name ari = Person('arimiage') {'_Person__name': 'arimiage'} # print(Person.__dict__) print(ari.get_name) ari.name = 'fgo' {'_Person__name': 'fgo'} #对象空间 print(Person.__dict__) print(ari.__dict__) print(ari.name) del ari.name # 只是至关于调用被deleter装饰的方法,并不至关于删除name属性 {} 对象空间为空 # print(ari.__dict__) # 报错