1、property
property是一种特殊的属性,可实现把函数名变为属性名使用。它可以在不改变类接口的前提下使用存取方法 (即读值和取值)
来修改数据的属性,property类有3个方法getter(读操作)、setter(赋值操作)、deleter(删除操作),分别把对应的操作
绑定到指定的函数实现,应用如下:
class People: def __init__(self,name,weight,height): self.__name=name self.wt=weight self.ht=height @property def bmi(self): return self.wt / (self.ht ** 2) @property #便于用户访问隐藏的内部值name def name(self): return self.__name @name.setter #便于用户 修改name值 def name(self,obj): #obj=‘EGON‘ if not isinstance(obj,str): raise TypeError(‘名字的值必须是str类型‘) self.__name=obj #self.__name=‘EGON‘ @name.deleter def name(self): del self.__name p=People(‘egon‘,75,1.80) # print(p.bmi) # print(p.name) # p.name=‘EGON‘ # p.name=123 #报错 # print(p.name) # del p.name #删除name
2、classmethod
(1)绑定到对象的方法:在类内部没有任何修饰的情况下直接定义一个方法默认绑定一个self给对象来用
class Mysql: def __init__(self,host,port): self.host=host self.port=port def tell_info(self): print("<%s:%s>" %(self.host,self.port)) conn1=Mysql(‘127.0.0.1‘,8080) conn1.tell_info()
(2)绑定到类的方法:当函数体代码需要传进来的参数不再是对象了,而是类的时候。
以下是实现从配置文件里读IP和端口,完成实例化的程序:
HOST=‘1.1.1.1‘ PORT=8080
import settings class Mysql: def __init__(self,host,port): self.host=host self.port=port def tell_info(self): print("<%s:%s>" %(self.host,self.port)) @classmethod #绑定给类,由类来掉,把它当做第一个参数传进来完成实例化,再把结果返回 def from_conf(cls): return cls(settings.HOST, settings.PORT) conn2=Mysql.from_conf()
print(conn2.tell_info) conn2.tell_info() # 打印结果:<bound method Mysql.tell_info of <__main__.Mysql object at 0x00C9CFF0>>
<1.1.1.1:8080>
3、staticmethod
非绑定方法,不与任何东西绑定,定义的函数不需要任何东西传进来
import uuid class Mysql: def __init__(self,host,port): self.host=host self.port=port @staticmethod def create_id(): return uuid.uuid4() print(Mysql.create_id) print(Mysql.create_id()) #打印结果:<function Mysql.create_id at 0x02C6EC90> 2209806a-5ffc-47f2-86f1-cb2ac64ce404
整体代码:
import settings import uuid class Mysql: def __init__(self,host,port): self.host=host self.port=port def tell_info(self): print("<%s:%s>" %(self.host,self.port)) @classmethod def from_conf(cls): return cls(settings.HOST, settings.PORT) @staticmethod def create_id(): return uuid.uuid4() conn1=Mysql(‘127.0.0.1‘,8080) conn1.tell_info() conn2=Mysql.from_conf() conn2.tell_info() print(conn2.tell_info) print(Mysql.create_id) print(Mysql.create_id()) #打印结果:<127.0.0.1:8080> <1.1.1.1:8080> <bound method Mysql.tell_info of <__main__.Mysql object at 0x038294B0>> <function Mysql.create_id at 0x03831E40> bab5e25e-7de3-4273-a8cf-40829c716d87
类内部装饰器的使用:property、classmethod与staticmethod
原文:https://www.cnblogs.com/zh-xiaoyuan/p/11799037.html