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

 

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__],"变量名/函数名/类名等")

 

posted @ 2018-07-03 20:18  冯坤大神  阅读(146)  评论(0编辑  收藏  举报