day16-面向对象编程进阶
1.静态方法
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名或者实例名来调用这个方法
import os class Apple(object): def __init__(self,name): self.name = name @staticmethod ''' 实际上跟类没什么关系了,就是一个单纯的函数了, 唯一的关系是需要类名或者实例名来调用 '''' def eat(x): # 此时不需要传入位置参数self参数了 print("%s is eating %s" %(self.name,x)) def talk(self): print("%s is talking"% self.name) d = Apple("张三") d.eat(d) # 传入d对象 # 张三 is eating apple d.talk() # 张三 is talking
2.类方法
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是,classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。本身可以用类和对象来调用。
class A(object): bar = 1 def func1(self): print('foo') @classmethod def func2(cls): print('func2') # func2 print(cls.bar) # 1 cls().func1() # 调用foo方法 foo a = A() a.func2()
3.属性方法
@property的作用是在新式类中返回属性值。
class Person: def __init__(self, name): self.name = name @property #getter方法 def name(self): return self._name @name.setter #在setter方法中可以约束属性,非str将捕获一个type错误 def name(self,name): if not isinstance(name, str): raise TypeError("Expected a string") self._name = name p = Person('tom') print(p.name) # 当成属性访问 # tom p1 = Person(123) # typeerror:Expected a string