zoukankan      html  css  js  c++  java
  • python类属性和类方法以及静态方法和反射

    今日内容:

    1.属性

    2. 类方法

    3.静态方法

    4.反射

    1. 属性

    是指调用类中的函数,就像调用对象属性值一样调用.更权威解释:将方法 伪装 成属性,虽然在代码层面上没有任何高深之处,但是让其看起来更合理.

    示例:

    class A:
        def __init__(self,*args):
            self.name = args[0]
            self.height = args[1]
            self.weight = args[2]
        @property
        def bmi(self):
            return self.height /self.weight**2
    
    a1 = A("leon",1.72,60)
    print(a1.bmi)

    注意,这里是通过加@property  这个装饰器来实现的,

    即然是属性,那么也可以修改的,关于修改和删除,是通过下面方法实现的,

    示例:

    class B:
        def __init__(self,*args):
            self.name = args[0]
            self.__pwd = args[1]
        @property
        def pwd(self):
            return  self.__pwd
        @pwd.setter   #注意这里的装饰器名字和上面的函数名一致,以及下面的函数都是一致的,下面赋值会传入这个new_pwd里面
        def pwd(self,new_pwd):   
            self.__pwd = new_pwd
    obj1 = B("leon","hao123")
    obj1.pwd = 123456
    print(obj1.pwd)

    属性的删除操作示例:

    class B:
        def __init__(self,*args):
            self.name = args[0]
            self.__pwd = args[1]
        @property
        def pwd(self):
            return  self.__pwd
        @pwd.setter   #注意这里的装饰器名字和上面的函数名一致,以及下面的函数都是一致的,下面赋值会传入这个new_pwd里面
        def pwd(self,new_pwd):
            self.__pwd = new_pwd
        @pwd.deleter
        def pwd(self):
            del self.__pwd
    obj1 = B("leon","hao123")
    obj1.pwd = 123456
    print(obj1.pwd)
    del obj1.pwd
    print(obj1.pwd)

    具体操作流程如下:

    # 第一步,对属性进行改操作,自动执行 被这个@pwd.setter装饰器装饰的方法
    # 第二步,将新值传给这个被@pwd.setter装饰器装饰的方法里面,当做参数.

    2. 类方法,静态方法

    类方法:类名去调用类方法,自动将类的空间传给类方法中的cls..对象如果调用类方法,自动将类空间传给类中的cls

    示例:

    class C:
        num = 1
        def __init__(self,*args):
            self.name = args[0]
            self.age  = args[1]
        @classmethod
        def class_fun(cls):
            print(cls.num)
    c1 = C("leon",18)
    c1.class_fun()

     什么情况下使用类方法?
     直接让类去操作类中的方法,没有必要创建对象在操作的时候,用类方法.

    3. 静态方法

    静态方法:在类中定义一个静态方法,无需传入你的类空间,对象空间,可以当成普通函数去用.(也就是不用再传入self的,也就是类中的独立函数)

    示例:

    class D:
        def __init__(self):
            pass
        @staticmethod
        def fun(a,b):
            return a + b
    d1 = D()
    print(d1.fun(2,3))

     4.反射(非常非常重要,)

    反射:通过 字符串 操作一个空间 (对象).

    总共有四个方法:

    1.getattr()

    2.hasattr()

    3.setattr()

    4.delattr()

    四种场景的不同使用方法:

    1,实例化一个对象去研究

    示例:

    class A:
        country = "China"
        def __init__(self,*args):
            self.name  = args[0]
            self.age = args[1]
        def fun(self):
            print("666")
    
    a1 = A("leon",18)
    
    
    getattr(a1,"fun")()
    print(hasattr(a1,"name1"))
    # getattr(a1,"name1")
    setattr(a1,"sex","")
    print(getattr(a1,"sex"))
    delattr(a1,"name")
    print(hasattr(a1,"name"))

     2.类中去研究.

    class A:
        num = 1
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
        def fun(self):
            print("IN A")
    print(getattr(A,"num"))
    print(setattr(A,"num1",3))
    print(hasattr(A,"num1"))
    delattr(A,"num1")
    print(hasattr(A,"num1"))

     3,其他模块去研究.

    oldboy.py
    """
    
    class B:
        name_list = ['张三','旭哥','李四','旭哥']
    
        @staticmethod
        def add(a,b):return a+b
    
    def login(username,password):
        if username == 'alex' and password == '123':
            print('登录成功')
        else:
            print('登录失败')
    """
    
    import oldboy
    print(getattr(oldboy.B,"name_list"))
    print(hasattr(oldboy,"login"))
    setattr(oldboy,"name",1)
    print(hasattr(oldboy,"name"))
    print(getattr(oldboy,"name"))

    4.本模块(本文件)去研究.

    示例:

    import sys
    def login():
        print("登录")
    
    def fun():
        print("333")
    content = input(">>>")
    getattr(sys.modules[__name__],content)()

       

  • 相关阅读:
    向量求导几则公式备忘
    电脑硬件接触不良
    caffe编译新问题
    faster-rcnn 目标检测 数据集制作
    py-faster-rcnn 的makefile.config 注意事项
    ubuntu14.04 python + opencv 傻瓜式安装解决方案
    轻量级神经网络平台tiny-dnn实践
    OpenMP 并行编程
    React在Render中使用bind可能导致的问题
    为了cider,尝试emacs的坑
  • 原文地址:https://www.cnblogs.com/ahliucong/p/9259686.html
Copyright © 2011-2022 走看看