类和实例

在 Python 中,类(Class)是面向对象编程(OOP)的核心概念之一。类用于创建对象,对象是类的实例。类定义了对象的属性和方法,属性是对象的数据,而方法是对象的行为。

1. 定义类

使用 class 关键字定义类,类名通常采用大驼峰命名法(CamelCase)。

class MyClass:
    pass

2. 构造函数

__init__ 是一个特殊方法,用于初始化对象的属性。它在创建对象时自动调用。

构造方法中定义实例属性,这个示例中,每个 MyClass 类的实例都会有一个 name 属性

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

3. 创建实例

通过类名加括号创建对象,并传递必要的参数。

obj = MyClass("Alice")

4. 实例属性和方法

实例属性和实例方法是不一样的,实例方法和属性是每个实例具有的。类的方法和属性每个实例共享

构造方法中定义实例属性

类中定义的方法如果不用 @classmethod 修饰表示是实例方法,实例方法的第一个参数指向具体的实例(个数不限,第一个是实例,一般命名为 self

class MyClass:
  
    def __init__(self, name):
        self.name = name  # 实例属性

    # 实例方法,实例方法里访问属性,通过 self. 来访问
    def greet(self):
        return f"Hello, {self.name}!"  

obj = MyClass("Alice")  # 创建实例
print(obj.greet())  # 调用实例方法。输出: Hello, Alice!
print(obj.name)  # 访问实例属性(方法外面访问实例)。输出 Alice

obj.age = 10  # 给 obj 这个实例增加一个属性,别的 MyClass 的实例没有这个属性
print(obj.age)  # 输出 10

obj2 = MyClass("Bob")
print(obj2.age)  # 报错,obj2 没有 age 属性

5. 类属性和方法

实例属性和实例方法是不一样的,实例方法和属性是每个实例具有的。类的方法和属性每个实例共享

类中定义的变量就是类的属性

类中定义的方法如果使用 @classmethod 修饰表示类的方法,类的方法第一个参数指向类本身(个数不限,第一个是类本身,一般命名为 cls

class MyClass:
    class_attr = "I am a class attribute"  # 类属性

    @classmethod
    def class_method(cls):
        return f"Class method called, {cls.class_attr}"

print(MyClass.class_method())  # 调用类方法。输出: Class method called, I am a class attribute
print(MyClass.class_attr)  # 访问类属性。输出 I am a class attribute

MyClass.class_attr = "new attr"  # 修改类属性,只能这样来修改类属性
print(MyClass.class_attr)  # 输出 new attr

my_class = MyClass()
my_class.class_attr = "new attr"  # 不会报错,但这不是修改类属性,而是给 my_class 实例增加了一个实例 class_attr 属性

my_class.class_method()  # 实例也能调用类方法

6. 静态方法

静态方法不依赖于实例或类,使用 @staticmethod 装饰器定义。就像一个普通函数。

既然就像一个普通函数为什么要定义在类中,直接定义在外面不就行了?
也行,但是定义在类中可能更有语义,比如某个类是用来做某方面的运算的,某些方法不需要访问类和实例也能完成计算类的功能,这种方法就适合写在这个类中

class MyClass:
    @staticmethod
    def static_method():
        return "Static method called"

print(MyClass.static_method())  # 调用静态方法。输出: Static method called

静态方法与类方法、实例方法的区别

方法类型 参数 访问实例属性 访问类属性 调用方式
实例方法 self 可以 可以 通过实例调用
类方法 cls 不可以 可以 通过类或实例调用
静态方法 无(普通参数) 不可以 不可以 通过类或实例调用

7. 魔法方法

双下划线包围起来的方法就是魔法方法,也叫特殊方法,特点是他们会被自动调用(用于定义类的特定行为的,不需要手动调用)

  • __new__(cls, *args, **kwargs):创建对象时自动调用
  • __init__(self, ...):构造方法,对象被创建后调用
  • __del__(self):析构函数,对象被销毁时调用
  • __str__(self): 相当于 JAVAtoString() 方法,输出某个对象时会自动调用(默认是类和内存地址)
  • __add__(self, other):重载 + 运算符的行为
  • __eq__(self, other):重载 == 运算符的行为
  • __len__(self):定义 len() 函数的行为,自己定义的类的实例是不能传入 len() 方法的,如果自定义了 __len__(self) 就可以
  • ...

Python 创建实例时,先调用 __new__() 然后调用 __init()__ 方法

class MyClass:

    def __init__(self):
        print("__init__")

    def __new__(cls, *args, **kwargs):
        print("__new__")
        return object.__new__(cls)

MyClass()

输出如下:

__new__
__init__
posted @ 2025-03-09 18:26  CyrusHuang  阅读(60)  评论(0)    收藏  举报