在Python中,类成员的访问权限是一个非常重要的概念。它涉及到了程序的封装性和可维护性。本文将从多个方面对Python类成员访问权限进行详细的阐述,并给出对应的代码示例。
一、公有成员
公有成员是指通过类对象、实例对象都可以访问的成员。在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()) print(p.get_age())
在上面的代码中,name和age属性以及get_name和get_age方法都是类的公有成员,可以通过实例对象进行访问。
二、私有成员
私有成员是指不能在类的外部直接访问的成员。在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()) # 这里会报错,因为__get_name是私有成员 print(p.__get_age()) # 这里会报错,因为__get_age是私有成员
在上面的代码中,__name和__age属性以及__get_name和__get_age方法都是类的私有成员,不能通过实例对象直接访问。
虽然不能直接访问私有成员,但是Python提供了一种名为“名字重整(Name Mangling)”的机制,用来访问私有成员。可以通过在成员名称前加上一个下划线和类名来访问私有成员。下面是一个简单的代码示例:
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._Person__get_name()) # 这里会输出Tom,因为_Person__get_name被重命名为_Person__get_name print(p._Person__get_age()) # 这里会输出18,因为_Person__get_age被重命名为_Person__get_age
在上面的代码中,通过在成员名称前加上_Person来访问私有成员。
三、保护成员
保护成员是指只能在类的内部以及子类中访问的成员。在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 class Student(Person): def __init__(self, name, age, grade): super().__init__(name, age) self._grade = grade def get_grade(self): return self._grade s = Student("Tom", 18, 3) print(s._get_age()) # 在子类中可以访问父类的保护成员 print(s._get_name()) # 在子类中可以访问父类的保护成员 print(s.get_grade())
在上面的代码中,_name和_age属性以及_get_name和_get_age方法都是类的保护成员,在子类中可以通过继承进行访问。
四、总结
在Python中,类成员的访问权限是通过成员名称前加上一个或两个下划线来决定的。公有成员是可以在类的内部、子类和类的外部进行访问的,私有成员只能在类的内部进行访问,但是可以通过名字重整机制访问,保护成员则只能在类的内部以及子类中访问。