python类:class创建、数据方法属性及访问控制详解

  • Post category:Python

Python类:class创建、数据方法属性及访问控制详解

1. 类的定义

定义一个类,使用class关键字,后面跟着类名和一个冒号,然后在缩进块内编写类的内容。类中可以定义属性(类变量和实例变量)和方法(类方法和实例方法)。类名通常使用骆驼式命名方式。

示例:

class Person:
    pass

2. 数据成员

在类中定义的变量有两种类型:类变量和实例变量。类变量属于类本身,可以通过类名访问;实例变量属于每个类的实例,可以通过self关键字访问。

示例:

class Person:
    species = 'human'  # 类变量

    def __init__(self, name, age):
        self.name = name  # 实例变量
        self.age = age  # 实例变量

3. 方法成员

在类中定义的函数也有两种类型:类方法和实例方法。类方法通过classmethod装饰器定义,第一个参数是类本身;实例方法不需要装饰器,第一个参数是self,代表类的实例。

示例:

class Person:
    species = 'human'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def from_birth_year(cls, name, birth_year):
        age = datetime.date.today().year - birth_year
        return cls(name, age)  # 返回一个Person类的实例

    def introduce(self):
        return f'My name is {self.name}, and I am {self.age} years old. I am a {self.species}.'

4. 访问控制

Python中没有像C++和Java那样的public、private和protected关键字,但是可以通过在属性名和方法名前添加一个下划线或两个下划线来实现简单的访问控制。

单下划线:表示属性或方法是受保护的,类外部可以访问,但不建议直接访问,应该通过公有的方法访问。

双下划线:表示属性或方法是私有的,类外部无法直接访问,只有内部可以访问。私有属性和方法可以通过属性名或方法名前添加一个下划线来访问。

示例:

class Person:
    species = 'human'

    def __init__(self, name, age):
        self._name = name  # 受保护的实例变量
        self.__age = age  # 私有实例变量

    @classmethod
    def from_birth_year(cls, name, birth_year):
        age = datetime.date.today().year - birth_year
        return cls(name, age)

    def introduce(self):
        return f'My name is {self._name}, and I am {self.__age} years old. I am a {self.species}.'

    def _foo(self):
        pass  # 受保护的实例方法

    def __bar(self):
        pass  # 私有实例方法

p = Person('Bob', 30)
print(p.introduce())  # 输出:My name is Bob, and I am 30 years old. I am a human.
print(p._name)  # 输出:Bob
print(p._foo())  # 输出:None
print(p._Person__age)  # 输出:30,访问私有实例变量
print(p._Person__bar())  # 报错:AttributeError: 'Person' object has no attribute '_Person__bar'

本文介绍了Python中类的定义、数据成员、方法成员和访问控制等内容,并提供了两个示例来说明如何使用Python类。