Python学习——property属性、魔法属性

一、property属性

1.1、property属性作用

 通过使用property属性,能够简化调用者在获取数据的流程

1.2、property属性的两种方式
  • 装饰器方式:在方法使用@property、@price.setter、@price.deleter 等
  • 类属型方式:在类中定义值为property对象的类属性
1.2.1、装饰器方式
在经典类中只有一种property装饰器:@property
在新式类(继承object)中有三种property装饰器:@property、@xxx.setter  @xxx.deleter
1.2.1.1、示例代码
class Person(object):
    def __init__(self):
        self.name = "张三"

    @property
    def nickname(self):
        print(self.name)

    @nickname.setter
    def nickname(self,val):
        self.name = val

    @nickname.deleter
    def nickname(self):
        del self.name

obj = Person();
obj.nickname     # 结果:张三    --- 通过@property可以将name方法以属性的形式调用
obj.nickname = "xiao qiang"   # ---通过@方法名.setter 将val值以属性赋值的方式通过方法设置给name
obj.nickname    # 结果:小强

obj.name
print(obj.__dict__)  # 结果:{'name': 'xiao qiang'}
del obj.nickname   # --- 通过@方法名.deleter,将name属性按照del属性的方式删除
print(obj.__dict__)  # 结果:{}
1.2.2、类属性方式
使用类属型方式创建property属性时,经典类和新式类无区别
在property方法中有四个参数
1.第一个参数是方法名:调用 对象.属性 时自动触发执行方法
2.第二个参数是方法名:调用 对象.属性 = xxx 时自动触发执行方法
3.第三个参数是方法名:调用 del 对象.属性 时自动触发执行方法
4.第四个参数是字符串:调用 对象.属性.__doc__ ,此参数是该属性的描述信息
1.2.2.1、示例代码
class Person(object):
    def __init__(self):
        self.name = "张三"

    def getName(self):
        print(self.name)

    def setName(self,val):
        self.name = val

    def delName(self):
        del self.name

    nickname = property(getName,setName,delName,"昵称...")

obj = Person();
obj.nickname     # 结果:张三    --- 调用property中第一个参数中的getName方法
obj.nickname = "xiao qiang"   # ---调用property中的第二个参数中的setName方法
obj.nickname    # 结果:小强

print(obj.__dict__)  # 结果:{'name': 'xiao qiang'}
del obj.nickname   # --- 调用property中的第三个参数中的delName方法
print(obj.__dict__)  # 结果:{}

description = Person.nickname.__doc__   # 获取property中第四个参数
print(description)  # 结果:...

二、魔法属性

Python中,具有特殊含义的类属型
1. __doc__
  • 获取类的描述信息
class Foo(object):
    """这是描述信息"""
    def run(self):
        pass

print(Foo.__doc__) # 这是描述信息
2. __module__ 、 __class__
  • __module__ 表示当前操作的对象在那个模块
  • __class__ 表示当前操作的对象的类是什么
test.py
class Person(object):
    def __init__(self):
        pass
        
main.py
from test import Person
obj = Person()
print(obj.__module__)  # test
print(obj.__class__)  # <class 'test.Person'>
3. __init__
  • 初始化方法,通过类创建对象时,自动触发执行
class Person(object):
    def __init__(self):
        self.name = "xiao ming"

object = Person()
4. __del__
  • 当对象在内存中被释放时,自动触发执行
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,
因为此工作都是交给Python解释器来执行,所以,__del__的调用是由解释器在进行垃圾回收时自动触发执行的。
class Person(object):  
    def __del__(self):
        pass
5. __call__
  • 对象后面加括号,触发执行
注:__init__方法的执行是由创建对象触发的,即:对象 = 类名() ;
而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()
class Person(object):
    def __call__(self, *args, **kwargs):
        print("call....") # call....
        print(*args) # 1 2
        print(kwargs) # {'name': 'zhang san', 'age': 22}
obj = Person()
obj("1","2", name="zhang san",age = 22)
6. __dict__
  • 类或对象中的所有属性
class Person(object):
    country = "china"
    def __init__(self):
        self.name = "zhangsan"
        self.age = 22
obj = Person()

print(Person.__dict__)  # {'__module__': '__main__', 'country': 'china', '__init__': <function Person.__init__ at 0x000000A7F64EAB70>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
print(obj.__dict__) # {'name': 'zhangsan', 'age': 22}
7. __str__
  • 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值
class Person(object):
    def __str__(self):
        return "str..........."
obj = Person()
print(obj) #str...........
8. __getitem__、__setitem__、__delitem__
  • 用于索引操作,如字典。以上分别表示获取、设置、删除数据
class Course(object):
    def __init__(self):
        self.language = {"python":"最好用的语言","php":"世界上最好的语言"}

    def __getitem__(self, key):
        print(self.language[key])

    def __setitem__(self, key, value):
        self.language[key] = value

    def __delitem__(self, key):
        del self.language[key]

obj = Course()
obj['python']         # 自动触发执行 __getitem__      结果:最好用的语言 
obj['c'] = 'c很牛逼'   # 自动触发执行 __setitem__
obj["c"]              # c很牛逼
obj["php"]       #世界上最好的语言
del obj["php"]   # 自动触发执行 __delitem__
obj["php"]       # 报错 KeyError: 'php
9. 等等…
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值