zoukankan      html  css  js  c++  java
  • 类内部装饰器的使用:property、classmethod与staticmethod

    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
  • 相关阅读:
    【Cocos2d-x for WP8 学习整理】(1)创建一个新项目
    与本机其他应用交互的简单介绍
    Windows Phone GB2312
    Windows Phone 横竖屏切换动画
    Linq To VisualTree
    Epub基础知识介绍
    【使用Unity开发Windows Phone上的2D游戏】(2)初识工具
    操作系统Unix、Windows、Mac OS、Linux的故事
    PHP开发环境搭建
    linux和mac
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/11799037.html
Copyright © 2011-2022 走看看