欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PY学习笔记

程序员文章站 2022-05-14 17:09:32
...

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()