PY学习笔记
PythonNoteDay_7
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,
实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:
class Student(object):
…
def get_name(self):
return self.__name
def get_score(self):
return self.__score
按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问:(_name)
不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量
如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:
class Student(object):
…
def set_score(self, score):
self.__score = score
错误做法:
bart = Student(‘Bart Simpson’, 59)
bart.get_name()
‘Bart Simpson’bart.__name = ‘New Name’ # 设置__name变量!
bart.__name
‘New Name’
新增了__name变量,系统将__name 变成原来的__name变量没有改变
我们自己写的类,如果也想用len(myObj)的话,就自己写一个__len__()方法
class MyDog(object):
… def len(self):
… return 100
…dog = MyDog()
len(dog)
100
当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。
#统计访问次数
class countlist:
def __init__ (self,*args):
self.values = [x for x in args]
self.count = {}.fromkeys(range(len(self.values)),0)
def __len__(self):
return len(self.values)
def __getitem__(self,key):
self.count[key] += 1
return self.values[key]
华摄氏度转换:
class celsius:
def __init__(self,value = 26.0):
self.value = float(value)
def __get__(self,instance,owner):
return self.value
def __set__(self,instance,value):
self.value = float(value)
class fahrenheit:
def __get__(self,instance,owner):
return instance.cel * 1.8 +32
def __set__(self,instance,value):
instance.cel = (float(value)-32)/1.8
class temperature:
cel = celsius()
fah = fahrenheit()
上一篇: HDU 4031 Attack
下一篇: Attack(OWASP翻译1)