咸糖记录编程的地方

念念不忘,必有回响。

目录
cook book 类与对象 2
/  

cook book 类与对象 2

##创建可管理的属性
下面是对属性添加检查
添加了@property 装饰器后访问属性会首先访问def firs_name: 方法
在__init__中使用self.first_name=first_namefirst_name进行赋值
会访问

@first_name.setter
    def first_name(self,value):

这个函数 先进行类型判断 如果不是string就直接抛出错误 否则就给_first_name赋值
之后访问first_name 属性时直接去访问@propery装饰的函数 返回一个_first_name赋值
first_name

class Person:
    def __init__(self,first_name):
        self.first_name=first_name

    @property
    def first_name(self):

        return self._first_name

    @first_name.setter
    def first_name(self,value):
        if not isinstance(value,str):
            raise TypeError('expected a string')
        self._afirst_name=value
        # this the realy save

    @first_name.deleter
    def first_name(self):
        raise AttributeError("Can't delete attribute")

##在创建多个实例的时候节省内存

class Date:
    # while define __slots__  instance will be define by fixed length list
    __slots__ = ['year','month','day']
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day

将属性储存的字典变为列表 有较大副作用 不适合继承

##使用super

class A:
    def spam(self):
        print("A.spam")

class B(A):
    def spam(self):
        print('B.spam')
        super().spam()

B().spam()

super 不仅可以调用父类的构造方法 还可以用来调用父类的普通方法

通过调用父类的构造方法 可以完全的进行初始化

class A():
    def __init__(self):
        self.x = 0


class B(A):
    def __init__(self):
        # because B overwrite A.__init__()
        # if not super().__init__() python can't find x
        super().__init__()

        self.y=1
print(B().x)

###在代理模式中的应用
将对象a 作为属性传给代理
使用super 分别给代理 或者 a 设置属性 如果有保护属性标识代表的意义为增加一个新的成员
否则就给_obj 成员添加属性

class A():
    def __init__(self):
        self.x = 0

class Proxy:
    # this proxy is mean to give a instance to setattr or get his attr
    def __init__(self, a):
        self._obj = a

    def __getattr__(self, item):
        return getattr(self._obj, item)

    def __setattr__(self, key, value):

        if key.startswith("_"):
            super().__setattr__(key, value)
            # setattr(self,key,value) this is a wrong
        else:
            setattr(self._obj,key, value)

A=A()
a=Proxy(A)
setattr(a,"_ojb","sads")
print(a._ojb)

————-之后更新!————————锻炼去了!—————————————


标题:cook book 类与对象 2
作者:xiantang
地址:http://xiantang.info/articles/2019/06/03/1559551064404.html

评论