C#中的属性
在C#中,属性是用于封装保护字段用的,它有访问器与设置器,当你在VS中输入prop之后可按tab按键快速创建一个属性。

public:表示的是访问级别,这里是公开,也就是在定义这个属性的函数之外我们也可以调用这个属性,int:表示的是这个属性它封装的是一个整型字段(可简单理解为变量,字段是类或结构中定义的变量)。MyProperty:显而易见就是属性名字了。get与set分别是访问器与设置器。
上图是属性的简略声明,是vs所提供的快捷方法,接下来我们看看C#完整的属性声明。

当你在vs中输入propfull,再按下tab键,vs就会自动生成一个属性的完整声明。
在这里可以看出,属性是先定义了一个myVar字段,他的访问级别是private(私有),这是为了防止外界轻易改动这里面的数据从而导致程序出现bug,但当外界有需要对这个字段做出一些改变的时候怎么办呢?这时候属性封装器就登场了,在图中,MyProperty属性封装了myVar字段,外界虽然不能直接访问到myVar,但是可以通过MyProperty属性进行访问,其中get是获取并返回myVar字段的值,而set是将MyProperty获取的值传入给myVar。
看到这里是否感觉这个属性很鸡肋了,感觉多此一举了。其实不然,我们再看下图。

之前我们说过,属性是用于保护字段的,以防止传入一些非法值导致程序出现bug。这里我们就对set器增加了点小内容,使得它所设置的值是在我们预期范围内,假如我们给Level属性赋值'easy'或者‘costom’的时候,设置器就会将‘2’或‘4’赋值给level字段,而其他不在考虑内的值都将被抛出输入异常。并不会传入一些非法值影响到我们的程序。
Python属性
在python中也是具有属性这一说,作用也是相差无几,我们来看看python中的属性声明。

在这里我们同样是在类中进行操作,_name和_hp就可以等价于C#中的字段,也就是作用在此类中的变量,但有一点,这两个变量是在我创建了实例之后才有的,在没创建实例之前是不存在的。(_单下划线开头进行命名意思是此变量是受保护的,我只希望它在这个类里可以使用,当然这不是强制的,你可以在外界访问修改它,这只是给自己提个醒,一个约定俗成的命名规则。如果你就想让它变为私有的,可以用__双下划线开头)这里我们也用到了属性来封装这_name和_hp,在python中使用@property来进行对变量的封装,同时这也是个访问器,也就是C#中的get,作用也是一样的,获取并返回变量中的值,@hp.setter就是ptyhon中的属性设置器,这里我们同样是加了点判断来保证传入的hp值是在我们的预期范围内的(如果传入的hp大于等于0就直接赋值给_hp,否则把0赋值给_hp),这样就避免了传入负值而导致战斗者一直不死的bug了。
多说一点,图中的def __init__(self,name,hp)那段函数是类的初始化器,在创建了一个类的实例后就调用此方法,name与hp是用于接收外界传入的变量值并将其赋值给_name和_hp,作用范围只在这个初始化器中,后文设置器中看到的hp是该设置器接受外界变量的,作用范围也只在该设置器中,与初始化器中的hp虽然同名,但其实是两个变量。self是代表类的实例,也就是当前的实例化,并非类。
Comments NOTHING