'''
单下划线、双下划线、头尾双下划线说明:
__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问。(约定成俗,不限语法)
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
==============================================================
class Person(object):
    def __init__(self, name, age):
        # self.name = name
        self.__name = name  # __name即私有属性,设置 _Person__name = ”yuan“
        self.__age = age
    def foo(self):
        print("姓名:", self.__name)  # self._Person__name
    def get_name(self): #查看私有属性name方法
        return self.__name
    def set_name(self, new_name): #修改私有属性name方法
        self.__name = new_name
    def set_age(self, new_age):#修改私有属性age方法
        if new_age < 200:
             self.__age = new_age
        raise Exception("年龄不能超过两百岁!")
    def get_age(self): #查看私有属性name方法
        print(self.__age)
#p1 = Person("rain", 22)
#p1.foo() # 姓名: rain
#print(dir(p1)) # ['_Person__age', '_Person__name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'foo', 'get_age', 'get_name', 'set_age', 'set_name']
#ret = p1.get_name()
#print(ret) # rain
#p1.set_name("rains")
#print(p1.get_name()) # rains
#p1.age = 10000
#p1.get_age() # 22
#p1.set_age(1560)
#p1.get_age() # Exception: 年龄不能超过两百岁!
######################################################
class Person(object):
    def __init__(self, name, age):
        # self.name = name
        self.__name = name  # __name即私有属性,设置 _Person__name = ”yuan“
        self.age = age
        self._score = 100
    def get_name(self):
        print(self.__name)
class Teacher(Person):
    def get_age(self):
        print(self.age)
        print(self._score)
yuan = Teacher("xi", 22)
# print(dir(yuan))
yuan.get_name() # xi
'''