is,==的区别
a is b-->判断a和b是否指向同一块内存空间
a==b-->判断a和b指向的空间里的内容是否一样
深拷贝,浅拷贝
浅拷贝
浅拷贝是对于一个对象的顶层拷贝
拷贝的是内存空间,并不是拷贝内容
深拷贝是对于一个对象所有层次的拷贝(递归)
浅拷贝对于不可变和可变类型的copy不同
a=[1,2,3] --------------列表
b=copy.copy(a)
这时打印两个变量的地址不同,如果a附加值,b不会变
a=(1,2,3)
b=copy.copy(a)
这时打印两个变量的地址一样,如果a附加,b也会得到相同的值
私有属性添加getter和setter方法:
classMoney(object):
def__init__(self):
self.__money =0
defgetMoney(self):
returnself.__money
defsetMoney(self, value):
if isinstance(value, int):
self.__money = value
else:
print("error:不是整型数字")
使用property升级getter和setter
classMoney(object):
def__init__(self):
self.__money =0
defgetMoney(self):
returnself.__money
defsetMoney(self, value):
ifisinstance(value, int):
self.__money = value
else:
print("error:不是整型数字")
money = property(getMoney, setMoney)
运行结果:
In [1]:fromget_setimportMoney
In [2]:
In [2]: a = Money()
In [3]:
使用property取代getter和setter方法
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
@property成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2个作用
·将方法转换为只读
·重新实现一个属性的设置和读取方法,可做边界判定
classMoney(object):
def__init__(self):
self.__money =0
@property
defmoney(self):
returnself.__money
@money.setter
defmoney(self, value):
ifisinstance(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