面向对象编程篇(一)

在 Python 中,类(Class)是一种定义对象(Object)的结构,它包含了对象的状态(属性)和行为(方法)。类提供了一种方式来封装和组织代码,使得代码更加模块化和可重用。

下面是一个简单的 Python 类的示例:

class Person:
    # 类的属性(通常称为类变量或静态变量)
    species = "Human"

    # 类的构造方法(初始化方法),在创建对象时调用
    def __init__(self, name, age):
        # 实例属性,每个对象都有自己的属性值
        self.name = name
        self.age = age

    # 类的方法,定义对象的行为
    def greet(self):
        print(f"Hello, my name is {self.name} and I am {self.age} years old.")

    # 类的静态方法,通过类直接调用,不需要创建对象
    @staticmethod
    def species_info():
        return f"The species of this class is {Person.species}."

# 创建类的实例(对象)
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

# 访问对象的属性和方法
print(person1.name)    # 输出: Alice
print(person2.age)     # 输出: 25
person1.greet()        # 输出: Hello, my name is Alice and I am 30 years old.

# 访问类的静态方法
print(Person.species_info())  # 输出: The species of this class is Human.

在上面的例子中,Person 是一个类,它有一个类变量 species 和一个构造方法 init,以及一个实例方法 greet 和一个静态方法 species_info。

  • init 方法是一个特殊的方法,被称为构造器或初始化方法。当创建类的新实例时,它会自动被调用。
  • greet 方法是一个实例方法,它必须通过类的实例来调用,并且它可以访问和修改实例的属性。
  • species_info 方法是一个静态方法,它使用 @staticmethod 装饰器定义。静态方法不需要访问或修改实例的状态,它们可以通过类本身来调用。

通过类,你可以创建多个具有相同属性和方法的对象,这些对象可以具有不同的属性值,从而实现代码的复用和灵活性。

类的实例属性

在 Python 中,类的实例属性是指与类的单个实例相关联的属性。这些属性是在创建类的实例时通过初始化方法(init 方法)设置的,并且每个实例都有其自己的属性副本,这些副本可以独立地修改而不会影响其他实例。

下面是一个简单的例子,展示了如何在 Python 类中定义和访问实例属性:

class Person:
    def __init__(self, name, age):
        # 实例属性通过初始化方法设置
        self.name = name
        self.age = age

    def introduce(self):
        # 实例方法可以通过self访问实例属性
        print(f"Hello, my name is {self.name} and I am {self.age} years old.")

# 创建Person类的两个实例
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

# 访问和修改实例属性
print(person1.name)  # 输出: Alice
print(person1.age)   # 输出: 30
person1.age += 1     # 修改person1的age属性

# 调用实例方法
person1.introduce()  # 输出: Hello, my name is Alice and I am 31 years old.

# 访问另一个实例的属性
print(person2.name)  # 输出: Bob
print(person2.age)   # 输出: 25

# 注意:修改person1的属性不会影响person2的属性

在这个例子中,Person 类有两个实例属性:name 和 age。这些属性是通过 init 方法初始化的,并且在每个实例中都是唯一的。当我们修改 person1.age 的值时,这只会影响 person1 实例,而 person2 实例的 age 属性保持不变。

实例属性是对象导向编程中封装和信息隐藏的一个关键部分,因为它们允许我们为每个对象存储独特的状态信息。

类的属性(Attributes)

在Python中,类的属性(Attributes)是类定义的一部分,用于存储类的状态信息。属性可以是实例属性(Instance Attributes),即与类的特定实例相关的属性,也可以是类属性(Class Attributes),即与类本身相关的属性,而不是与类的任何特定实例相关的属性。

以下是一个简单的示例,展示了如何在Python类中定义和使用属性:

class MyClass:
    # 类属性
    class_attribute = "This is a class attribute."

    def __init__(self, instance_attribute):
        # 实例属性
        self.instance_attribute = instance_attribute

# 创建类的实例
obj = MyClass("This is an instance attribute.")

# 访问类属性
print(MyClass.class_attribute)  # 输出: This is a class attribute.

# 访问实例属性
print(obj.instance_attribute)  # 输出: This is an instance attribute.

# 为实例添加新的实例属性
obj.new_instance_attribute = "This is a new instance attribute."
print(obj.new_instance_attribute)  # 输出: This is a new instance attribute.

# 修改实例属性
obj.instance_attribute = "This is a modified instance attribute."
print(obj.instance_attribute)  # 输出: This is a modified instance attribute.

# 尝试访问不存在的属性会抛出 AttributeError
# print(obj.non_existent_attribute)  # 抛出 AttributeError

在这个例子中,class_attribute 是一个类属性,它属于类本身,而不是类的任何特定实例。所有实例共享相同的类属性。而 instance_attribute 是一个实例属性,它特定于类的每个实例。当你创建一个类的实例时,可以为它分配特定的实例属性。

你可以通过实例或类本身来访问类属性,但是只能通过实例来访问实例属性。尝试通过类来访问实例属性将会抛出一个 AttributeError 异常。

类属性通常在类定义时设置,并且可以用于定义类级别的常量、状态或与类相关的其他信息。实例属性则用于存储与特定对象状态相关的信息。

类的实例方法

在Python中,实例方法是与类的特定实例相关联的方法。它们可以通过该实例来调用,并且可以访问和修改该实例的属性以及调用该实例的其他方法。实例方法至少接受一个参数,通常命名为self,它代表类实例本身。以下是一些定义和使用实例方法的例子:

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

    # 实例方法:计算圆的面积
    def area(self):
        return 3.14 * self.radius ** 2

    # 实例方法:计算圆的周长
    def perimeter(self):
        return 2 * 3.14 * self.radius

# 创建一个Circle类的实例
circle = Circle(5)

# 调用实例方法
print(circle.area())  # 输出圆的面积
print(circle.perimeter())  # 输出圆的周长

在这个例子中,Circle 类有两个实例方法:area 和 perimeter。这两个方法都接受一个参数 self,它代表 Circle 类的一个实例。通过 self,方法可以访问实例的属性(如 self.radius),并且可以执行与实例相关的操作。

当我们创建一个 Circle 类的实例 circle 并调用它的 area 和 perimeter 方法时,Python 会自动将 circle 实例作为第一个参数传递给这些方法。

实例方法还可以接受其他参数,以支持更复杂的功能。例如,如果我们想定义一个方法来设置圆的半径,我们可以这样做:

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

    def set_radius(self, new_radius):
        self.radius = new_radius

# 创建一个Circle类的实例
circle = Circle(5)

# 调用set_radius实例方法来设置新的半径
circle.set_radius(10)

# 再次调用area和perimeter方法,将使用新的半径
print(circle.area())  # 输出新的圆的面积
print(circle.perimeter())  # 输出新的圆的周长

在这个例子中,我们添加了一个 set_radius 实例方法,它接受一个参数 new_radius,用于设置实例的 radius 属性。

类的方法(Methods)

在Python中,类的方法(Methods)是定义在类内部的函数,它们与类的实例或类本身相关联,并可以通过实例或类来调用。方法通常用于执行与类的状态或行为相关的操作。

方法可以分为实例方法(Instance Methods)、类方法(Class Methods)和静态方法(Static Methods)。
实例方法

实例方法是与类的实例(对象)相关联的方法。它们至少接收一个参数,通常命名为self,代表类的实例本身。实例方法可以通过类的实例来调用,并且可以访问和修改实例的属性。

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

    def say_hello(self):
        print(f"Hello, my name is {self.name}")

# 创建实例
obj = MyClass("Alice")

# 调用实例方法
obj.say_hello()  # 输出: Hello, my name is Alice

类方法

类方法是与类本身相关联的方法,而不是与类的实例相关联。类方法使用装饰器@classmethod来定义,并且它们的第一个参数是类本身,通常命名为cls。类方法可以通过类本身或类的实例来调用,但它们通常不访问或修改实例的属性。

class MyClass:
    @classmethod
    def print_class_name(cls):
        print(cls.__name__)

# 调用类方法
MyClass.print_class_name()  # 输出: MyClass

# 也可以通过实例调用类方法
obj = MyClass()
obj.print_class_name()  # 输出: MyClass

静态方法

静态方法与类及其实例都没有直接的关联。它们只是定义在类内部的普通函数,使用装饰器@staticmethod来定义。静态方法不需要特殊的参数来引用类或实例。

class MyClass:
    @staticmethod
    def static_method():
        print("This is a static method.")

# 调用静态方法
MyClass.static_method()  # 输出: This is a static method.

# 也可以通过实例调用静态方法
obj = MyClass()
obj.static_method()  # 输出: This is a static method.

属性方法

除了上述方法外,Python类还可以定义属性方法(也称为getter和setter方法),用于访问和修改实例属性的值。属性方法通过装饰器@property来定义getter方法,并使用@property.setter来定义setter方法。

class Person:
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        if isinstance(value, str):
            self._name = value
        else:
            raise ValueError("Name must be a string.")

# 创建实例
person = Person("Bob")

# 访问属性
print(person.name)  # 输出: Bob

# 修改属性
person.name = "Alice"
print(person.name)  # 输出: Alice

# 尝试修改属性为非法类型
person.name = 123  # 抛出 ValueError

在这个例子中,name 是一个属性,可以通过 person.name 来访问和修改。当访问 name 属性时,会调用相应的 getter 方法。当为 name 属性赋值时,会调用相应的 setter 方法,该方法会检查值的有效性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫Devin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值