свойства Python и встроенные свойства

недвижимость недвижимость

1. Добавьте частный добытчик свойства и методы инкубационных

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. Используйте геттерные свойства и сеттер методы обновления

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 стать функцией свойства, то можно сделать необходимые проверки на имущество, когда назначения, а также для обеспечения четкого кода Короче говоря, есть два действия

Способ преобразования только для чтения
повторно установки свойств для достижения метод чтения и определяет граница делает

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 встроенные свойства класса и методы
Here Вставка рисунка Описание
Классический (старый тип) рано , если нет родителя , чтобы наследовать, наследование, не пишут в пустых классах

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

Когда подкласс не реализует __init__ метода, по умолчанию автоматически вызвать родительский класс. Когда __init__ метод, как это определено, чтобы быть сам __init__ метод вручную вызывает родительский класс
Here Вставка рисунка Описание

__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

рекомендация

отwww.cnblogs.com/python960410445/p/12163923.html