pydata

Keep Looking, Don't Settle

python class (3): private variable, __var or _var

私有变量
class Person(object):
 def __init__(self, name, age):
  self.name = name 
  self.age = age
p = Person('Mike', 30)

外部代码还是可以自由地修改一个实例name, age

p.name = 'John' 这时候变成John,而不是Mike了

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头, 就变成了一个私有变量(private),只有内部可以访问,外部不能访问

class Person(object):
 def __init__(self, name, age):
  self.__name = name 
  self.__age = age
p = Person('Mike', 30)
p.__name = 'John'  #报错 AttributeError: 'Person' object has no attribute '__name'

如果要获取或者修改对象的属性怎么办?用get_或者set_方法

class Person(object):
 def __init__(self, name, age):
  self.__name = name 
  self.__age = age
 def get_name(self):
  return self.__name
 def set_name(self, value):
  self.__name = value

p = Person('Mike', 30)
p.get_name()
p.set_name('John')
p.get_name() 

在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量, 特殊变量是可以直接访问的,不是private变量,所以,不能用__name__这样的变量名 以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的 但是,应该把它视为私有变量,不要随意访问