zoukankan      html  css  js  c++  java
  • python类属性用法总结

    属性的定义:python中的属性其实是普通方法的衍生。

    操作类属性有三种方法:

    1.使用@property装饰器操作类属性。

    2.使用类或实例直接操作类属性(例如:obj.name,obj.age=18,del obj.age)

    3.使用python内置函数操作属性。

    属性存在的意义

    1、访问属性时可以制造出和访问字段完全相同的假象,属性由方法衍生而来,如果Python中没有属性,方法完全可以代替其功能。

    2、定义属性可以动态获取某个属性值,属性值由属性对应的方式实现,应用更灵活。

    3、可以制定自己的属性规则,用于防止他人随意修改属性值。

    下面详细介绍三种操作类属性的方法:

    1.使用@property装饰器操作类属性。

         定义时,在普通方法的基础上添加@property装饰器;属性仅有一个self参数,调用时无需括号;

       优点:

        1) @property装饰器可以实现其他语言所拥有的getter,setter和deleter的功能(例如实现获取,设置,删除隐藏的属性)

        2) 通过@property装饰器可以对属性的取值和赋值加以控制,提高代码的稳定性。 

        实例代码1:

    #encoding=utf-8                                                  
    class Goods():  #新式类                                    
        @property                                                      
        def price(self): #查看属性值                                           
            print ('@property ')                                         
        @price.setter    #修改、设置属性                                     
        def price(self, value):                                        
           print ('@price.setter' )                                      
        @price.deleter   #删除属性                                          
        def price(self):                                               
           print ('@price.deleter')                                      
                                                                       
    obj = Goods(50)                                                    
    obj.price         # 自动执行 @property 修饰的 price 方法,并获取方法的返回值              
    obj.price = 2000  # 自动执行 @price.setter 修饰的 price 方法,并将2000赋值给方法的参数
    del obj.price     # 自动执行 @price.deleter 修饰的 price 方法 
    结果输出:
    @property
    @price.setter
    @price.deleter

    实例代码2:通过@property装饰器对属性的取值和赋值加以控制

    class Goods(object):
        def __init__(self):
            self.value=50
        @property
        def price(self):  # 查看属性
            return self.value
    
        @price.setter  # 添加或设置属性(属性名.setter)
        def price(self, value):
            if value >=50 and value<=100:  #对属性的取值和赋值加以控制
                self.value=value
                print (self.value)
            else:
                print ("请输入一个50到100之间的数!")
    
        @price.deleter  # 删除属性(属性名.deleter) 注意:属性一旦删除,就无法设置和获取
        def price(self):
            del self.value
            print ("price is deleted!")
    
    obj = Goods()
    print (obj.price)   # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
    obj.price=106     # 自动执行 @price.setter 修饰的 price 方法,并将106 赋值给方法
    del obj.price     # 自动执行 @price.deleter 修饰的 price 方法
    结果输出:
    50
    请输入一个50到100之间的数!
    price is deleted!

    2.使用类或实例直接操作类属性

     缺点:对类的属性没有操作控制规则,容易被人修改。

    #coding=utf-8
    class Employee (object):
        #所有员工基类
        empCount = 0
        def __init__(self, name, salary) :
             #类的构造函数
             self.name = name
             self.salary = salary
             Employee.empCount += 1
        def displayCount(self) :
             #类方法
             print ("total employee ",Employee.empCount)
        def displayEmployee(self) :
             print ("name :",self.name , ", salary :", self.salary)
    
    #创建Employee类的实例对象
    emp1 = Employee("丽丽", 10000)
    emp1.displayCount()
    emp1.displayEmployee()
    emp1.salary = 20000 #修改属性 salary
    print (emp1.salary)
    emp1.age = 25 #添加属性 age
    print (emp1.age)
    del emp1.age #删除 age属性
    emp1.empCount=100
    Employee.empCount=1000
    结果:
    total employee  1
    name : 丽丽 , salary : 10000
    20000
    25

    3.使用python内置函数操作属性。
       1)getattr(obj, name[, default]):访问对象的属性,如果存在返回对象属性的值,否则抛出AttributeError异常。
       2)hasattr(obj,name):检查是否存在某个属性,存在返回True,否则返回False。
       3)setattr(obj,name,value):设置一个属性。如果属性不存在,会创建一个新属性,该函数无返回值。若存在则更新这个值。
       4)delattr(obj, name):删除属性,如果属性不存在则抛出AttributeError异常,该函数也无返回值。

    应用实例:

    #encoding=utf-8
    class Employee(object):
        #所有员工基类
        empCount=0
        def __init__(self,name,age,salary):
            #类的构造函数
            self.name=name
            self.salary=salary
            self.age=age
            Employee.empCount+=1
            
        def displayCount(self):
            #类方法
            print("total employee",Employee.empCount)
        
        def displayEmployee(self):
            print("name:",self.name,"age:",self.age,",salary:",self.salary)
              
    #创建Employee类的实例对象
    emp1=Employee("Rose",27,20000)
    
    #判断实例对象是否存在某个属性,存在返回True,否则返回False
    if hasattr(emp1,'name'):
        name_value=getattr(emp1,'name') #获取name属性值
        print( "name的属性值为:",name_value)
    else:
        print ("员工属性不存在")
    
    #给实例添加一个属性  
    if hasattr(emp1,'tel'):   
        print ("员工属性已存在")
    else:              
        setattr(emp1,'tel','17718533234') 
        t1=getattr(emp1,'tel')
        print("tel的属性值为:",t1) 
        setattr(emp1,'tel','15042622134')  
        t2=getattr(emp1,'tel')
        print("tel修改后的属性值为:",t2) 
    
    #给实例删除一个属性 
    if hasattr(emp1,'age'):     
        delattr(emp1,'age')    
    else:              
      print ("员工tel属性不存在")
    
    #验证属性是否删除成功  
    if hasattr(emp1,'age'):
        print( "属性age存在!")
    else:
        print ("属性age不存在!")
    结果:
    name的属性值为: Rose
    tel的属性值为: 17718533234
    tel修改后的属性值为: 15042622134
    属性age不存在!

    此外还有Python内置类属性,这里做简单介绍:

    __dict__ : 类的属性(获取类所有信息):结果返回一个字典包含类属性及属性值,类方法等所有类信息

    __doc__ :类的文档字符串,也就是类的帮助信息。

    __name__: 类名

    __module__: 类定义所在的模块 如果在当前模块返回’__main__’; 如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)

    __bases__ : 类的所有父类(包含了所有父类组成的元组)

    实例代码:

    #coding=utf-8                                       
    class Employee (object):                            
            """所有员工的基类"""                                                
            empCount = 0                                         
            def __init__(self, name, salary) :                  
                    #类的构造函数                                             
                    self.name = name                                    
                    self.salary = salary                                
                    Employee.empCount += 1                              
            def displayCount(self) :                            
                    #类方法                                                
                    print ("total employee ",Employee.empCount )          
            def displayEmployee(self) :                         
                    print ("name :",self.name , ", salary :", self.salary)
                    
    print ("Employee.__doc__:", Employee.__doc__       )  
    print ("Employee.__name__:", Employee.__name__     )  
    print ("Employee.__module__:", Employee.__module__ )  
    print ("Employee.__bases__:", Employee.__bases__   )  
    print ("Employee.__dict__:", Employee.__dict__     )
    结果:
  • 相关阅读:
    hdu 1042 N!
    hdu 1002 A + B Problem II
    c++大数模板
    hdu 1004 Let the Balloon Rise
    hdu 4027 Can you answer these queries?
    poj 2823 Sliding Window
    hdu 3074 Multiply game
    hdu 1394 Minimum Inversion Number
    hdu 5199 Gunner
    九度oj 1521 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/ssj0723/p/10392993.html
Copyright © 2011-2022 走看看