类和实例
在 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): 相当于JAVA的toString()方法,输出某个对象时会自动调用(默认是类和内存地址)__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__

浙公网安备 33010602011771号