zoukankan      html  css  js  c++  java
  • 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,复用性

  • 相关阅读:
    Java第三次作业第四题
    Java第三次作业第三题
    Java第三次作业第二题
    Java第三次作业第一题
    具有注册、登陆以及后台管理功能的web开发
    KMP算法
    二叉排序树-插入算法
    算法刷题-1-单链表操作
    最牛X的编码套路
    day03 高级模块
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9377251.html
Copyright © 2011-2022 走看看