四时宝库

程序员的知识宝库

一文搞懂 Python 类和面向对象编程

在 Python 中,类就像一个蓝图或模板,可用于创建对象。想象一下,你想做一个玩具机器人。你可以有一个,告诉你机器人应该是什么样子,它能做什么,以及它有什么样的零件。该蓝图类似于 Python 中的类。你可以从这个蓝图上创建许多机器人玩具。

示例 1:简单类

在这个简单的例子中,定义了一个类Dog。它有一个初始化狗名的方法 __init__,以及一个返回消息的方法bark

class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):
        return f"{self.name} says Woof!"

示例 2:创建简单类

在此示例中,使用 constructor () 方法定义一个类Dog来初始化namebreed 属性。bark方法用于使狗吠叫。创建两个对象(实例)并在它们上调用方法bark

class Dog:
    def __init__(self, name, breed):
        self.name = name
        self.breed = breed

    def bark(self):
        return f"{self.name} says Woof!"

# Creating instances of the Dog class
dog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Molly", "Labrador")

print(dog1.bark())  # Output: Buddy says Woof!
print(dog2.bark())  # Output: Molly says Woof!

示例 3:类继承

在这里,有一个具有 common 属性的基类AnimalCat类继承name自并添加自己的方法meow 。当创建一个Cat对象时,它可以同时访问 namemeow方法。

class Animal:
    def __init__(self, name):
        self.name = name

class Cat(Animal):
    def meow(self):
        return f"{self.name} says Meow!"

cat = Cat("Whiskers")
print(cat.meow())  # Output: Whiskers says Meow!

示例 4:类变量和方法

在此示例中,定义了一个在所有实例之间共享的类变量piCircle类使用类变量和实例变量radius计算圆的面积。

class Circle:
    pi = 3.14159

    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return self.pi * self.radius**2

circle = Circle(5)
print(circle.area())  # Output: 78.53975

示例 5:私有属性

在下面提供的 Python 代码片段中,属性名称 (____account _number__balance) 之前的双下划线用于指示这些属性是私有的。这意味着它们不能直接从类外部访问,并且应通过类提供的方法访问或修改其值。

class BankAccount:
    def __init__(self, account_number, balance):
        self.__account_number = account_number
        self.__balance = balance

    def get_balance(self):
        return self.__balance

    def deposit(self, amount):
        self.__balance += amount
  1. __init__方法
  • __init__方法是类BankAccount的构造函数。它需要两个参数account_numberbalance ,用于初始化私有属性__account_number__balance
  • 通过在这些属性名称前面加上双下划线,表示不能直接从类外部访问它们。

2.方法:get_balance

  • get_balance方法是一种公共方法,它提供了一种检索私有属性值__balance的方法。
  • 由于__balance是私有的,因此无法直接使用__balance , 可以用get_balance该方法来访问其值。

3.方法:deposit

  • deposit方法也是一种公共方法,允许通过将指定的 amoun修改到 private 属性 来将钱存入银行账户__balance
  • get_balance一样,deposit__balance方法用于间接访问和修改属性。

示例 6:getter 和 setter 方法

在这里们使用 getter 和 setter 方法(get_ageset_age) 来控制对 private 属性_age的访问。这有助于强制实施数据封装。

class Student:
    def __init__(self, name, age):
        self._name = name  # Private attribute
        self._age = age    # Private attribute

    def get_age(self):
        return self._age

    def set_age(self, age):
        if age >= 0:
            self._age = age
  1. 构造函数 __init() 方法:__init方法是类Student的构造函数。它初始化属性__name和__agj,并使用作为参数 name 和 age 传递的值。
  2. 私有属性:_name属性_age,按照惯例使用单个下划线前缀(例如,_name、)标记为“私有”。此约定向其他程序员建议,不应直接从类外部访问这些属性。_age
  3. Getter 方法 get_age():get_age方法是一个公共方法,允许外部代码检索私有属性的值_age。它提供对 age 属性的受控访问。
  4. Setter 方法set_age ():set_age方法是用于修改属性值_age的公共方法。在更新年龄之前,它会检查提供的新年龄是否为负数 (年龄 >= 0)。这是一种简单的验证形式,以确保年龄保持非负整数。
  5. 创建类Student的实例:创建类的实例,名称为“Alice”,初始年龄为 20 岁。
  6. 使用 Getter 和 Setter 方法:get_age方法用于检索和打印学生的年龄,最初输出 .然后使用set_age方法将学生的年龄更改为 21 岁,并再次调用get_age方法以检索和打印更新的年龄,现在输出 .20 21

通过使用 getter 和 setter 方法,可以更好地控制对象的属性_age。私有属性不能从类Student外部直接访问,但可以通过定义的方法get_ageset_age来检索和修改它。这种封装有助于确保数据完整性,并为与对象数据交互提供清晰的接口,同时允许根据需要应用验证和逻辑。

示例 7:静态方法

静态方法使用 @staticmethodadd定义。它们无权访问特定于实例的数据,并且可以在类本身上调用,如示例中所示。在这里,我们定义了一个静态方法来执行加法。

class MathUtils:
    @staticmethod
    def add(x, y):
        return x + y

result = MathUtils.add(3, 5)
print(result)  # Output: 8

在此代码中:

  • MathUtils是一个类,其中包含一个名为 的静态方法add
  • @staticmethod是 Python 中的装饰器,指示以下方法是静态方法。方法不是静态的,但它有助于使代码更具可读性和更明确。

add方法被定义为接受两个参数x和y,并简单地返回它们的总和x + y

请注意静态方法的以下特征:

  • 无权访问实例数据:静态方法无权访问特定于实例的数据或属性。这意味着它们无法访问类中定义的属性。它们使用显式传递给它们的参数和任何其他数据。_ne
  • 在类上调用:可以在类本身上调用静态方法,而无需创建类的实例。在示例中,您接调用类MathUtils.add(3, 5)
  • 无参数:与以参数为第一个参数的实例方法不同,静态方法没有实例的特殊参数self(即无 参数)。它们仅对其输入参数进行操作。selfse

在此示例中,调用静态方法MathUtils.add(3, 5),传入值3和5 .该方法执行加法并返回结果,该结果存储在变量中并打印出来,从而产生 的输出。由于静态方法不绑定到任何特定实例,因此它们对于不依赖于对象状态但与类本身相关的实用工具函数或操作非常有用。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接