20 属性, 类方法, 静态方法. python2与python3的区别.

主要内容:

1.  属性:将方法伪装成属性,代码上没有什么变化,只是更加符合逻辑.

  @property

  @属性名.setter

  @属性名.deleter

  a : 属性的初始 

class Person:
    def __init__(self,name,height,hight):
        self.name = name
        self.height = height
        self.hight = hight
    @property
    def bmi(self):
        return '%s的bmi值是%s' % (self.name,self.height/self.hight**2)
p1 = Person('小明',45,1.6)
print(p1.bmi)
这样有点不符合逻辑方法都是动词,而bmi值是名词.所以引入属性这个概念.@property

 b : 属性的增删改查

class Person:
    def __init__(self,name,age):
        self.name = name
        if type(age) is int:               #判断age是不是数字.然后再封装属性.
            self.__age = age
        else:
            print('输入有误,请重新输入')
    @property   #把age伪装成一个属性名
    def age(self):
        return self.__age
    @age.setter
    def age(self,a1):
        if type(a1) is int:                 #判断传过来的a1是不是数字.
            self.__age = a1
        else:
            print('输入有误,重新输入')
    @age.deleter
    def age(self):
        del self.__age

p1 = Person('xiao',12)
p1.age = 21                                 #执行修改方法def age(self,a1)
print(p1.age)                               #执行age方法,返回已经修改的值.
print(p1.__dict__)
del p1.age
print(p1.age)                     #会报错,因为age已经删除,找不到了.
print(p1.__dict__)                #此时查询age已经不再对象所在的空间里.

2.  类方法:通过类名调用的方法,类方法中的第一个参数约定俗成为cls,python自动将类名(类空间)传给cls

  @classmethod

class A:
    def func(self):         #普通方法
        print(self)
    @classmethod            #类方法
    def func1(cls):
        print(cls)
a = A()
# a.func()           #对象调用func方法,自动将对象空间传给self
# A.func(a)          #类名调用func方法,需要传值.<__main__.A object at 0x0000022EE7CD8A58>
a.func1()            #<class '__main__.A'>  对象调用类方法,cls得到的是类本身
A.func1()            #<class '__main__.A'> 类方法: 通过类名调用的方法,类方法中第一个参数约定俗称cls,python自动将类名(类空间)传给cls.

  类方法的应用场景:

      a: 类中,有些方法不需要对象参与.

# 1.类中  有些方法不需要对象参与
class A:
    name = 'alex'
    id = 1
    @classmethod
    def func(cls):
        return cls.name + str(cls.id)          #这个时候不能用A,因为方法执行的时候,自动将类名传给cls,应该用cls,
print(A.func())                                 #alex1

  b:  对类中的静态变量进行改变,需要用到类方法.

  c : 通过继承,父类得到子类的类空间.

class A:
    age = 12
    @classmethod
    def func(cls):
        #得到b中的所有内容,可以对b中的所有内容进行更改.
        print(cls.age)
class B(A):
    age = 22
B.func()

  d : 不通过类方法,父类也可以得到子类空间的任意值

# 不通过类方法,想让我的父类的某个方法得到子类的类空间里面的任意值.
class A:
    age = 12
    def func(self):               # self 子类的对象,能得到子类空间的任意值
        print(self)

class B(A):
    age = 22
a1 = A()
a1.func()

3.  静态方法:

  @staticmethod

class A:
    @staticmethod
    def login(username,password):
        if username == 'alex' and password == 123:
            print('登录成功')
        else:
            print('失败')
A.login('alex',123)

  该login方法不使用静态方法,也可以实现该功能,但是需要给该方法传递self参数,而这个参数在方法中根本不会用到;

  可读性更好的代码,看到@staticmethod我们就知道这个方法并不需要依赖对象本身的状态。

  优点:  1,代码块清晰

     2,复用性

原文地址:https://www.cnblogs.com/gyh412724/p/9377251.html