首页 > 其他 > 详细

类内部装饰器的使用:property、classmethod与staticmethod

时间:2019-11-05 17:58:02      阅读:104      评论:0      收藏:0      [点我收藏+]

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
settings
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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!