Python修改私有变量、统计访问次数、华摄氏度转换

本文介绍Python中如何通过双下划线实现属性私有化,并提供访问和修改私有属性的方法。同时展示了如何定义特殊方法以支持len()等内置函数。

Python笔记Day7

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在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()
Python中的私有变量是指在类中以双下划线“__”开头的变量,这些变量只能在类内部访问,外部无法直接访问私有变量的作用是保护数据,防止外部对数据的直接修改,从而提高程序的安全性和稳定性。 在Python中,私有变量访问需要通过特殊的方式进行,即使用“_类名__变量名”的方式进行访问。例如,如果一个类中定义了一个私有变量“__name”,那么在类内部可以直接访问变量,但在类外部则需要使用“_类名__name”的方式进行访问。 下面是一个示例代码,演示了Python私有变量的定义和访问: class Person: def __init__(self, name, age): self.__name = name self.__age = age def get_name(self): return self.__name def get_age(self): return self.__age p = Person("Tom", 18) print(p.get_name()) # 输出:Tom print(p.get_age()) # 输出:18 print(p.__name) # 报错:'Person' object has no attribute '__name' print(p._Person__name) # 输出:Tom 在上面的代码中,Person类定义了两个私有变量“__name”和“__age”,并提供了两个公共方法“get_name”和“get_age”用于获取这两个变量的值。在类外部,无法直接访问私有变量“__name”和“__age”,需要通过公共方法进行访问。同时,如果在类外部使用“__name”和“__age”进行访问,会导致程序报错。而使用“_Person__name”和“_Person__age”进行访问,则可以成功获取私有变量的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值