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

    属性:
    例一:BMI指数(bmi是计算而来的,
    但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)
    
    成人的BMI数值:
    过轻:低于18.5
    正常:18.5-23.9
    过重:24-27
    肥胖:28-32
    非常肥胖, 高于32
      体质指数(BMI)=体重(kg)÷身高^2(m)
      EX:70kg÷(1.75×1.75)=22.86
    1,初识属性:
    class A:
        def __init__(self, name, weight, height):
            self.name = name
            self.__weight = weight
            self.__height = height
    
        @property  # 属性
        def bmi(self):
            return self.__weight / self.__height ** 2
    
    
    
    ly = A('女司机', 54, 1.6)
    print(ly.bmi)
    View Code
    属性:将方法 伪装 成属性,虽然在代码层面上没有任何高深之处,
    但是让其看起来更合理.
    2,属性改,和删除.
    class Mes:
        def __init__(self, name, age,password):
            self.__name = name
            self.__age = age
            self.__password = password
    
        @property
        def password(self):
            '''对密码加密'''
            self.__password = hash(self.__password + 'sb')
            return self.__password
    
        @password.setter
        def password(self,new_password):
            if type(new_password) is str:
                self.__password = new_password
            else:
                print('请输入字符串类型')
        @password.deleter
        def password(self):
            print(6666)
    p1 = Mes('张三', 18)
    p1.name = '张三三'
    print(p1.name)
    print(p1.name)
    p1 = Mes('张三', 18,'hao123')
    print(p1.password)
    之前对属性的更改
    p1.name = 'alex'
    p1.password = '123456'
    print(p1.password)
    del p1.password
    print(p1.password)
    View Code
    第一步,对属性进行改操作,自动执行 被这个@password.setter装饰器装饰的方法
    第二步,将新值传给这个被@password.setter装饰器装饰的方法里面,当做参数.
    property ***
    @password.setter  *
    @password.deleter
    class Mes:
        def __init__(self, name, age,password):
            self.name = name
            self.__age = age
            self.__password = password
    
        @property
        def password(self):
            return self.__password
    
        @password.setter
        def password(self,new_password):
            self.__password = new_password
    
        @password.deleter
        def password(self):
            del self.__password
    
    p1 = Mes('张三', 18, 'hao123')
    p1.name = 'alex'
    print(p1.name)
    print(p1.password)
    p1.password = '123456'  # 这只是行代码,没有真正的改.(触发了那个函数)
    print(p1.password)
    del p1.password
    print(p1.password)
    View Code
    商品类  封装商品名,商品原价, 商品折扣  定义一个方法,计算商品现价.
    class Goods:
        def __init__(self,name,original_price,discount):
            self.name = name
            self.__original_price = original_price
            self.__discount = discount
    
        @property
        def price(self):
            return self.__original_price * self.__discount
    
        @property
        def original_price(self):
            return self.__original_price
    
        @original_price.setter
        def original_price(self,new_original_price):
            self.__original_price = new_original_price
    
    apple = Goods('苹果',5,0.95)
    print(apple.price)
    apple.original_price = 10
    print(apple.price)
    View Code
    类方法,静态方法:
    class A:
        __name = 'alex'
        def func(self):
            print(self,'in  func')
    
        @classmethod   # 类方法
        def func1(cls):
            print(cls, 'in func1')
    
        def change(self,new_name):
            A.__name = new_name
            return A.__name
        @classmethod
        def change(cls,new_name):
            A.__name = new_name
            return A.__name
    
    a1 = A()
    a1.func()
    A.func(a1)
    
    类名去调用类方法,自动将类的空间传给类方法中的cls
    对象如果调用类方法,自动将类空间传给类中的cls
    A.func1()
    a1.func1()
    什么情况下使用类方法?
    直接让类去操作类中的方法,没有必要创建对象在操作的时候,用类方法.
    a2 = A()
    print(a2.change('wusir'))
    print(A.change(111,'wusir'))
    print(A.change('wusir'))
    View Code
    类名去调用类方法,自动将类的空间传给类方法中的cls
    对象如果调用类方法,自动将类空间传给类中的cls
    什么情况下使用类方法?
    直接让类去操作类中的方法,没有必要创建对象在操作的时候,用类方法.
    静态方法:
    class A:
        __name = 'alex'
        def func(self):
            print(self,'in  func')
    
        @classmethod   # 类方法
        def func1(cls):
            print(cls, 'in func1')
    
    
        @staticmethod  # 静态方法
        def login(username,password):
            print('登录成功...')
    
    A.login('alex', '123')
    View Code
    静态方法:在类中定义一个静态方法,无需传入你的类空间,对象空间,可以当成普通函数去用.
    反射:
    非常非常非常非常重要的方法.
    通过 字符串 操作一个空间 (对象).
    getattr()   用于模块的取文件属性返回某属性
    hasattr()   判断检查对象是否拥有某个属性
    setattr()   函数置文件属性方法将对象中的属性设置为新的属性
    delattr()   删除对象中的属性删除
    1,实例化一个对象去研究
    class A:
        country = 'China'
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    
    a1 = A('alex', 1000)
    print(a1.name)
    print(getattr(a1,'name1'))  从对象中得到这个属性对应的值
    print(hasattr(a1,'age'))   判断此对象中,有没有这个属性
    setattr(a1,'sex','')
    setattr(a1,'name','wusir')
    print(getattr(a1,'name'))
    print(getattr(a1,'sex'))  # 对一个对象设置属性
    delattr(a1,'name')  # 对一个对象属性删除
    print(getattr(a1,'name'))
    
    if hasattr(a1,'name1'):
        getattr(a1,'name1')
    else:
        print('没有...')
    View Code
    2,类中去研究.
    class A:
        country = 'China'
        job = 'student'
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def func(self):
            print('in func')
    print(getattr(A,'country1',False))
    if getattr(A,'country1',False):
    content = input('>>>').strip()  # country
    print(A.content)  #(A.'country')
    # 报错,因为输入的是字符串类型,A.content中content是变量
    name = '1 + 2'
    name2 = 'name'
    print(eval(name2))
    
    
    print(A.country)
    print(A.content)
    print(eval('1+ 2'))
    正确的:
    content = input('>>>').strip()  # 'country'字符串
    你拿到的是一个字符串类型,然后你又想对这个类进行操作
    if hasattr(A,content):
        print(getattr(A,content))
    
    print(getattr(A,'job1','没有此值'))
    print(getattr(A,'func'))
    getattr(A,'func')(11)
    View Code
    3,其他模块去研究.
    建立一个模块:
    class B:
        name_list = ['张三','旭哥','李四','旭哥']
    
        @staticmethod
        def add(a,b):return a+b
    
    def login(username,password):
        if username == 'alex' and password == '123':
            return '登录成功'
        else:
            return '登录失败'
    
    导入模块进行操作:
    import oldboy
    print(oldboy.B.name_list)
    
    bobj = getattr(oldboy,'B')
    print(getattr(bobj,'name_list'))
    
    print(getattr(oldboy.B,'name_list'))
    
    print(getattr(oldboy.B,'add')(3,4))
    print(getattr(oldboy,'login')('alex','123'))
    def func():
        pass
    print(func())
    View Code
    4,本模块(本文件)去研究.
    import sys
    def login():
        print(55)
    
    def func3():
        print(333)
    
    content = input(">>>")
    print(content())  # 这样错的  ,输入的是字符串
    print(sys.modules[__name__])
    getattr(sys.modules[__name__],'login')()
    View Code
    装饰器函数

    property
    classmethod
    staticmethod
    装饰器
    圆形
    半径  r
    面积  area
    周长 perimeter
    from math import pi
    class Circle:
        def __init__(self,r):
            self.r = r
        @property
        def area(self):
            return self.r**2*pi
        @property
        def perimeter(self):
            return 2*pi*self.r
    c = Circle(5)
    c.r
    print(c.area)  #==>c.area()
    c.perimeter  
    将一个方法伪装成一个属性
    @property:把一个方法伪装成一个属性
    @名字.setter 在修改一个属性的时候调用这个方法
    @名字.deleter 在del.属性名的时候调用这个方法
    @classmethod
    类方法
    调用者是一个类
    有默认参数,cls,表示当前类
    在什么时候使用类方法?
    只有使用类中的静态属性或者类方法或者静态方法的时候
    @staticmethod静态方法
    调用者也是一个类
    没有默认必须穿的参数
    什么时候用静态方法
    既不会用到对象的资源也不会用到类的资源的时候
    class Person:
        def __init__(self,name):
            self.__name = name
        @property
        def name(self):
            return self.__name
    alex = Person('alex')
    print(alex.name)
    
    class Person:
        def __init__(self,name):
            self.__name = name
        @property
        def name(self):
            return self.__name
        @name.setter
        def name(self,new):
            self.__name = 'sb'
    alex = Person('alex')
    print(alex.name)
    alex.name = 1234 #能不能改?——不能直接改
    print(alex.name)
    class Person:
        def __init__(self,name):
            self.__name = name
        @property
        def name(self):
            return self.name
        @name.setter
        def name(self,new):
            if type(new) is str:
                self.__name = new
    alex = Person('alex')
    print(alex.name)
    alex.name = 'sb'
    print(alex.name)
    
    class Demo:
        @property
        def wahaha(self):
            print('in wahaha')
            return 'wahaha'
    d = Demo()
    d.wahaha
    
    class Demo:
        @property
        def wahaha(self):
            print('in wahaha')
            return 'wahaha'
        @wahaha.setter
        def wahaha(self,new):
            print('执行setter方法了',new)
    d = Demo
    print(d.wahaha)  #可以被查看
    d.wahaha = 123  #可以被修改
    
    
    class Demo:
        def __init__(self,wahaha):
            self.__wahaha = wahaha
        @property
        def wahaha(self):
            print('in wahaha')
            return self.__wahaha
        @wahaha.setter
        def wahaha(self,new):
            self.__wahaha = new
    d = Demo
    print(d.wahaha)  #可以被查看
    d.wahaha = 123  #可以被修改
    print(d.wahaha)
    View Code
    某一种商品打特价:
    class Goods:
        def __init__(self,discount,origin_price):
            self.__price = origin_price
            self.__discount = discount
        @property
        def price(self):
            return self.__price*self.__discount
    apple = Goods(0.8,10)
    print(apple.price)
    一个属性可以被查看,可以被修改,
    可以被删除吗?
    class Goods:
        def __init__(self,discount,origin_price):
            self.__price = origin_price
            self.__discount = discount
        @property
        def price(self):
            return round(self.__price * self.__discount,2)
        @price.setter
        def price(self,new_price):
            self.__price = new_price
    
    apple = Goods(0.8,10)
    print(apple.price)
    apple.price = 12
    print(apple.price)
    
    class A:
        def __init__(self,path):
            self.f = open('path','w')
        def write(self,count):
            self.f.write(count)
    
    class A:
        def __init__(self,path):
            self.f = open(path,'w')
        def write(self,content):
            self.f.write(content)
        def close(self):
            self.f.close()
    obj = A('wahaha')
    obj.write('wahahayawahaha')
    obj.close()
    del obj.f    #f变量删除,文件没有关闭
    #open()
    
    
    
    
    
    
    class A:pass
    a = A()
    a.name = 'egon'
    print(a.__dict__)
    del a.name
    print(a.__dict__)
    
    class A:
        def __init__(self,path):
            self.__f = open(path,'w')
        @property
        def f(self):return self.__f
    
        @f.deleter
        def f(self):      # 所有的借用操作系统的资源,在删除一个变量之前都必须先归还资源
            self.close()
            del self.__f
    
        def write(self,content):
            self.__f.write(content)
    
        def close(self):
            self.__f.close()
    
    obj = A('wahaha')
    obj.write('wahahayawahaha')
    obj.close()
    
    del obj.f   # f变量删除,文件没有关
    print(obj.f)
    某一商品打特价
    method 方法——函数
    property 伪装成属性的方法 —— 特性
    classmethod 类方法
    staticmethod静态方法
    class Goods:
        __discount = 0.8
        def __init__(self,origin_price):
            self.__price = origin_price
        @property
        def price(self):
            return round(self.__price*Goods.__discount,2)
        @price.setter
        def price(self,new_price):
            self.__price = new_price
            def change_discount(self,new_discount):
                Goods.__discount = new_discount
    apple = Goods
    apple.change_discount(1)
    print(apple.price)
    商品打特价
    类方法:
    class Goods:
        __discount = 0.8
        def __init__(self,origin_price):
            self.__price = origin_price
        @property
        def price(self):
            return round(self.__price * Goods.__discount,2)
        @price.setter
        def price(self,new_price):
            self.__price = new_price
        @classmethod
        def change_discount(cls,new_discount):
            # print(cls,Goods)
            #Goods.__discount = new_discount
            cls.__discount = new_discount
    
    # apple = Goods(10)
    # apple.change_discount(1)
    Goods.change_discount(0.7)
    apple = Goods(10)
    print(apple.price)
    View Code
    静态方法:
    class Student:
        def __init__(self,name,sex):
            self.name = name
            self.sex = sex
    
        @staticmethod   # 相当于函数
        def login():
            name = input('>>')
            if name == 'alex':print('登录成功')
    # 学生的登陆行为
    Student.login()
    View Code
    method        方法 —— 函数               由实例化对象去调用
    property      伪装成属性的方法 —— 特性     由实例化对象去调用
    classmethod   类方法                     由类调用,只使用类中的静态变量
    staticmethod  静态方法                   由类调用,一个方法既不会用到对象的属性,也不会用到类的属性
  • 相关阅读:
    webpack4入门配置
    RequireJs的理解
    js一次控制 多个style样式
    vue中封装一个全局的弹窗js
    地理位置索引 2d索引
    索引属性 稀疏索引,定时索引
    索引属性 unique指定
    索引属性 name指定
    mongodb索引 全文索引使用限制
    mongodb索引 全文索引之相似度查询
  • 原文地址:https://www.cnblogs.com/ls13691357174/p/9258238.html
Copyright © 2011-2022 走看看