• 属性,类方法,静态方法,反射


     

    1.属性 @property

    2.类方法 @classmethod

    3.静态方法  @staticmethod

    4.反射

    1.属性:

    class  A:

      __name = "武大"

      def __init__(self,name,weight,height):

        self.name = name

        self.__weight = weigh

        self.height = height

      def bmi(self):

        return  self.__weight/height**2

    a = A("alex",70,1.8)

    print(a.bmi())

    class A:

      def __init__(self,name,weight,height):

        self.name = name

        self.__weight = weight

        self.height  = height

      @property

      def bmi(self):

        return self.__weight/height**2

    a = A("alex",70,1.8)

    print(a.bmi)

    属性:将方法伪装成属性虽然在代码层面上没有任何高深之处,但是让其看起来更合理.

    属性的改和删除

    class A:

      def __init__(self,name,weight,height):

        self.name = name

        self.__weight = weight

        self.height = height

      @property

      def bmi(self):

        return self.__weight/height**2

      @property

      def weight(self):

        return  self.__weight 

      @weight.setter

      def weight(self,new_weight):

        self.__weight = new_weight

      @weight.deleter

      def weight(self):

        del self.__weight

    a = A("alex",70,1.8)

    print(a.bmi)

    print(a.weight)

    a.weight = 80

    更改属性,一共进行了两步操作:

    第一步:对属性进行改操作自动执行,被这个@weight.setter装饰器装饰的方法.

    第二步:将新值传给被@weight.setter装饰器装饰的方法里面,当做参数

    print(a.weight)

    print(a.bmi)

    del a.weight

    print(a.weight)  #因为self.__weight被删除了,找不到self.__weight,所进行到这一步会报错.

    删和改一样的运行步骤.

    2.类方法@classmethod

    class  A:

      __name = "武大"

      def func(self):

        print("in   a")

      @classmethod

      def func1(cls):

        print(cls,"in    b")

    a1 = A()

    a1.func1()

    A.func1()

    类名去调用类方法,自动将类的空间传给类方法中的cls(在Python中约定俗成这么写)

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

    class  A:

      __name = "wusir"

      def func(self,new_name):

        A.__name = new_name

        return A.__name

      @classmethod

      def func1(cls,new_name):

        A.__name = new_name

        return A.__name

    a2 = A()

    print(a2.func1("alex"))

    print(A.func1("alex"))

    print(A,func(22,"alex")

    什么情况下使用类方法?

    直接让类去操作类中的方法,没有必要创建对象再操作的时候用类方法.

    3.静态方法:@staticmethod

    静态方法:在类中定义一个静态方法,无需传入类空间,对象空间,可以当普通函数取用.

    class A:

      @staticmethod

      def func(username,password):

        print(555555)

    a = A()

    a.func()

    A.func()

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

    反射针对的是拿到的是一个字符串类型,然后对这个类进行操作.

    反射共有四种方法:

    getattr() : 从对象中得到这个属性对应的值.

    hasattr() : 判断此对象中,有没有这个属性.

    setattr() : 对一个对象或者类设置(增加或者改)属性    

    delattr() : 删除对象或者类属性

    我们从四个方面来观察反射:

    1.实例化一个对象研究:

    class  A:

       name =  "alex"

      def __init__(self,age,sex):

        self.__age = age

        self.sex = sex

      def func(self):

        print(33333)

    a = A(23,"女")

    print(getattr(a,"name"))  #从对象中得到这个属性对应的值

    print(hasattr(a,"sex"))  #判断此对象中,有没有这个属性.

    setattr(a,"height",180)      #对一个对象设置(增加或者改)属性

    delattr(a,"sex")    #对一个对象属性删除,不可删除和修改

    2.在类中研究:

    class A:

      name = "wusir"

      def func(self):

        print(6666)

    print(getattr(A,name))

    print(hasattr(A,func))

    setattr(A,"sex","女")

    delattr(A,"name)

    3.在其他模块去研究:

    import  模块名    #引入模块

    print(getattr(模块名,"变量名/函数名/类名等")

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

    import  sys      #引入本模块

    print(getattr(sys.modules[__name__],"变量名/函数名/类名等")

  • 相关阅读:
    Java中继承的详细用法
    Java中继承的详细用法
    树莓派中安装QT
    qt在windows下的udp通信(最简单)
    qt+opencv对两幅图片进行融合
    浅谈QT打印功能实现
    qt中采用宽带speex进行网络语音通话实验程序
    实时预览的在线 Markdown 编辑器
    LigerUI一个前台框架增、删、改asp.net代码
    .NET MVC通过反射获取数据修
  • 原文地址:https://www.cnblogs.com/fengkun125/p/9260424.html
Copyright © 2020-2023  润新知