目录
属性是通过__int__函数定义,并通过self传递给实例的一种数据类型,属性一般在__int__函数中。
一、实例属性的使用
1、在__int__里直接初始化
可以直接给属性赋初值a=0 b=1
class Atom(): #定义一个Atom类
def __init__(self):
self.a = 0 #定义属性a的值为0
self.b = 1 #定义属性b的值为1
A1 = Atom() #把类Atom()实例化为A1
print(A1.a) #打印属性a的值 为0
print(A1.b) #打印属性b的值 为1
2、传递参数初始化
class Atom(): #定义一个Atom类
def __init__(self,a,b): #在__int__里建立传递参数a,b
self.a = a #定义属性a
self.b = b #定义属性b
A1 = Atom(0,1) #把类Atom()实例化为A1,并且对类赋初值
print(A1.a) #打印属性a的值 为0
print(A1.b) #打印属性b的值 为1
二、属性值的修改
1、可以直接对属性值修改
给属性赋初值后,可以后续通过直接赋值改变属性实例中的值
class Atom(): #定义一个Atom类
def __init__(self):
self.a = 0 #定义属性a的值为0
self.b = 1 #定义属性b的值为1
A1 = Atom() #把类Atom()实例化为A1
print(A1.a) #打印属性a的值 为0
print(A1.b) #打印属性b的值 为1
A1.a = 10 #在实例中修改a的值为10
print(A1.a) #打印的结果为 10
print(Test().a) #打印结果为 0 再实例中改变属性的值,不会影响到类
2、通过方法对属性值进行修改
定义好初值后,可以通过实例中的方法再去改变原来的值
class Atom(): #定义一个Atom类
def __init__(self):
self.a = 0 #定义属性a的值为0
self.b = 1 #定义属性b的值为1
def change(self,a1): #定义一个change的方法
self.a=a1 #定义属性a1的值
A1 = Atom() #把类Atom()实例化为A1
print(A1.a) #打印属性a的值 为0
A1.change(4) #给方法change中的a1赋值为4,然后a1在对a赋值为4
print(A1.a) #此时打印的a的值就是4
三、访问限制
为了代码的健壮性,如果我们不想在外部访问内部的属性的值应该怎么操作? 在上面的例子中,可以直接或者通过方法对属性值进行修改,但是如果我不想让参数被修改,我可以把对应的方法去掉,但是应该怎么避免直接对属性值修改的这种操作呢?
这时候就可以在属性的名称前加上两个下划线__,
这样就可以让内部属性不被外部访问,在Python中,实例的变量名如果以__
开头,就变成了一个私有变量,只有内部可以访问,外部不能访问。(不包括以双下划线开头和双下划线结尾的属性,如__a__这个算是特殊变量不算是私有变量)
class Atom(): #定义一个Atom类
def __init__(self,a):
self.__a = a #定义属性a的值为0
def test(self): #定义一个方法test
print(self.__a) #输出a的值
A1 = Atom(1) #把类Atom()实例化为A1,并对a赋值为1
print(A1.a) #打印a的值 结果为:AttributeError: 'Atom' object has no attribute 'a'
print(A1.__a) #打印__a的值 结果为:AttributeError: 'Atom' object has no attribute '__a'
A1.__a = 10 #给A1.__a赋值为10
print(A1.__a) #此时我们打印A1.a的值发现打印结果为10,并且代码没有报错了 但是这个10真的修改了实例里面的a吗?
A1.test() #打印的结果为 1 从这就可以发现A1.__a的10并没有赋值到实例的__a上 因为实际上A1.__a的变量和内部的__a不是一个变量,内部的__a已经被定义成了_Atom__a
A1._Atom__a = 10 #此时尝试下修改 A1._Atom__a的值为10
A1.test() #打印结果为10,这时候才是赋值成了10
下图为公众号二维码,内容会同步发出,大家可以关注一起学习
这个是张狗子小哥哥的公众号,会分享一些平时的工作心得,可以关注看下。