一 property的用法,将一个函数假装成属性app
1 #第一种写法: 2 from math import pi 3 class Circle: 4 def __init__(self,r): 5 self.r=r 6 def mj(self): 7 return pi*self.r**2 8 def zc(self): 9 return 2*pi*self.r 10 c1=Circle(3) 11 print(c1.mj()) 12 13 #第二种写法:用property 将一个函数假装成为属性 14 class Circle: 15 def __init__(self,r): 16 self.r=r 17 @property 18 def mj(self): 19 return pi*self.r**2 20 @property 21 def zc(self): 22 return 2*pi*self.r 23 c1=Circle(3) 24 print(c1.mj) 25 26 27 # property 跟__私有属性的结合 如:苹果打折的问题 28 class Goods(): 29 def __init__(self,price,discount): 30 self.__price=price 31 self.discount=discount 32 @property 33 def price(self): #现有的价格 34 return self.__price * self.discount 35 @price.setter #设置一个新的属性即新的价格 36 def price(self,newprice): 37 self.__price=newprice 38 @price.deleter #删除一个价格 39 def price(self): 40 del self.__price 41 42 apple=Goods(8,0.7) 43 print(apple.price) 44 apple.price=10 45 print(apple.price) 46 print(apple.__dict__) 47 del apple.price 48 print(apple.__dict__)
二 classmethod 函数
类方法经过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量spa
#若是某一个类中的方法 并无用到这个类的实例中的具体属性
# 只是用到了类中的静态变量 就使用类方法code
1 class Dog(object): 2 def __init__(self,name): 3 self.name = name 4 5 @classmethod 6 def eat(self): 7 print("%s is eating" % self.name) 8 9 10 11 d = Dog("ChenRonghua") 12 d.eat() 13 14 执行报错以下,说Dog没有name属性,由于name是个实例变量,类方法是不能访问实例变量的
此时能够定义一个类变量,也叫name,看下执行效果对象
class Dog(object): name = "我是类变量" def __init__(self,name): self.name = name @classmethod def eat(self): print("%s is eating" % self.name) d = Dog("ChenRonghua") d.eat() 此次没报错
1 # classmethod 2 class Person: 3 Country='中国人'
4 @classmethod #把func变成了一个类方法 5 def func(cls): #cls指向了类的内存空间 6 print('当前角色的国家是%s' %cls.Country) 7 # alex=Person() 8 # alex.func() 9 10 Person.func()
三 staticmethod 静态方法不须要self这个参数了blog
经过@staticmethod装饰器便可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,能够在实例化后直接调用,而且在方法里能够经过self.调用实例变量或类变量,但静态方法是不能够访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实至关于跟类自己已经没什么关系了,它与类惟一的关联就是须要经过类名来调用这个方法内存
1 # staticmethod 2 ## 若是 一个方法 既不会用到对象中的属性也不会用到类中的属性 3 # 就应该被定义为一个静态方法 4 5 class Student: 6 @staticmethod #不须要实例化一个学生能够直接调用login登陆方法 7 def login(): 8 name=input('name:') 9 pwd=input('pwd:') 10 if name =='hu' and pwd =='123': 11 print('登陆成功') 12 13 Student.login()