欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python属性和内建属性

程序员文章站 2022-06-09 16:48:24
属性property 1. 私有属性添加getter和setter方法 2. 使用property升级getter和setter方法 运行结果: 3. 使用property取代getter和setter方法 @property成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2 ......

属性property

1. 私有属性添加getter和setter方法

class money(object):
    def __init__(self):
        self.__money = 0

    def getmoney(self):
        return self.__money

    def setmoney(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型数字")

2. 使用property升级getter和setter方法

class money(object):
    def __init__(self):
        self.__money = 0

    def getmoney(self):
        return self.__money

    def setmoney(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型数字")
    money = property(getmoney, setmoney)

运行结果:

in [1]: from get_set import money

in [2]: 

in [2]: a = money()

in [3]: 

in [3]: a.money
out[3]: 0

in [4]: a.money = 100

in [5]: a.money
out[5]: 100

in [6]: a.getmoney()
out[6]: 100

3. 使用property取代getter和setter方法

@property成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2个作用

将方法转换为只读
重新实现一个属性的设置和读取方法,可做边界判定

class money(object):
    def __init__(self):
        self.__money = 0

    @property
    def money(self):
        return self.__money

    @money.setter
    def money(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型数字")

运行结果

in [3]: a = money()

in [4]: 

in [4]: 

in [4]: a.money
out[4]: 0

in [5]: a.money = 100

in [6]: a.money
out[6]: 100

内建属性

"teachclass.py"

class person(object):
    pass

python3.5中类的内建属性和方法
Python属性和内建属性
经典类(旧式类),早期如果没有要继承的父类,继承里空着不写的类

#py2中无继承父类,称之经典类,py3中已默认继承object
class person:
    pass

子类没有实现__init__方法时,默认自动调用父类的。 如定义__init__方法时,需自己手动调用父类的__init__方法
Python属性和内建属性

__getattribute__例子:

class itcast(object):
    def __init__(self,subject1):
        self.subject1 = subject1
        self.subject2 = 'cpp'

    #属性访问时拦截器,打log
    def __getattribute__(self,obj):
        if obj == 'subject1':
            print('log subject1')
            return 'redirect python'
        else:   #测试时注释掉这2行,将找不到subject2
            return object.__getattribute__(self,obj)

    def show(self):
        print('this is itcast')

s = itcast("python")
print(s.subject1)
print(s.subject2)

运行结果:

log subject1
redirect python
cpp

**__getattribute__的坑**

class person(object):
        def __getattribute__(self,obj):
            print("---test---")
            if obj.startswith("a"):
                return "hahha"
            else:
                return self.test

        def test(self):
            print("heihei")

    t.person()
    t.a #返回hahha
    t.b #会让程序死掉
        #原因是:当t.b执行时,会调用person类中定义的__getattribute__方法,但是在这个方法的执行过程中
        #if条件不满足,所以 程序执行else里面的代码,即return self.test  问题就在这,因为return 需要把
        #self.test的值返回,那么首先要获取self.test的值,因为self此时就是t这个对象,所以self.test就是
        #t.test 此时要获取t这个对象的test属性,那么就会跳转到__getattribute__方法去执行,即此时产
        #生了递归调用,由于这个递归过程中 没有判断什么时候推出,所以这个程序会永无休止的运行下去,又因为
        #每次调用函数,就需要保存一些数据,那么随着调用的次数越来越多,最终内存吃光,所以程序 崩溃
        #
        # 注意:以后不要在__getattribute__方法中调用self.xxxx