跳至主要内容

Python 中的类对象

Class objects in Python

如果您希望加深对 Python 编程的了解,那么必须深入了解和对象。从本质上讲,类是创建对象的蓝图,而对象本身是这些类的实例。在本指南中,我们将探索类对象的世界,并深入了解此强大语言中类和对象的基础知识。因此,无论您是刚开始使用 Python 还是寻求提高现有技能,请继续阅读以了解有关语言的这一关键方面的更多信息。

如何在 Python 中创建对象

Python 中的类和对象是面向对象编程中的基本概念。对象只是类的实例。

# Creating a Class
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def display(self):
        print(f"The car is a {self.year} {self.make} {self.model}.")
        
# Creating Objects
car1 = Car('Toyota', 'Corolla', 2018)
car2 = Car('Honda', 'Civic', 2019)

car1.display() # The car is a 2018 Toyota Corolla.
car2.display() # The car is a 2019 Honda Civic.

在此示例中,我们创建了一个名为 Car 的类,该类具有三个属性:makemodelyear__init__() 方法用于在创建新对象时初始化属性。display() 方法用于打印有关汽车的信息。我们从 Car 类创建了两个对象(car1car2)。我们为每辆汽车传递了 makemodelyear 属性的值。然后,我们对每个对象调用 display() 方法以打印有关汽车的信息。

总之,Python 中的类和对象用于创建自定义数据类型,这些数据类型可以具有属性和方法。在 Python 中使用类对象可以使代码更井然有序、更模块化。

Python 中的对象是什么

Python 中的类对象是指用于创建对象的蓝图或模板。它定义了对象将具有的属性和方法。在 Python 中,类用于创建类对象,这些对象可用于创建该类的实例或对象。

class Car:
    # Class object
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
    
    # Class method
    def get_details(self):
        return f"{self.make} {self.model} ({self.year})"

在此示例中,Car 是一个类对象,它定义了汽车的属性 - makemodelyear 以及返回汽车详细信息的方法 get_details()

class Dog:
    # Class object
    def __init__(self, breed, age):
        self.breed = breed
        self.age = age
        
    # Class method
    def bark(self):
        return "Woof! Woof!"

在此示例中,Dog 是另一个类对象,它定义了狗的属性 - breedage 以及返回狗叫声的方法 bark()

探索类对象的特性

Python 中的类对象是创建对象的蓝图。它定义了一组属性和方法,从该类创建的所有对象都将具有这些属性和方法。

  • 类:类是创建对象的蓝图。它定义了从该类创建的所有对象都将具有的属性和方法。
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

car1 = Car("Toyota", "Camry", 2020)
car2 = Car("Honda", "Accord", 2021)
  • 对象:对象是类的实例。它具有类中定义的所有属性和方法。
class Player:
    def __init__(self, name, position, number):
        self.name = name
        self.position = position
        self.number = number

p1 = Player("LeBron James", "Small Forward", 23)
print(p1.name, p1.position, p1.number)

解决类对象中的常见问题

在使用类对象时,可能会遇到一些常见问题。以下是其中一些最常见的问题及其解决方案

  1. AttributeError:此错误在尝试访问类或对象中不存在的属性时发生。要解决此错误,请确保属性存在且已正确定义。
class MyClass:
    def __init__(self, val):
        self.value = val

obj = MyClass(5)
print(obj.value)  # Output: 5

# print(obj.foo)  Output: AttributeError: 'MyClass' object has no attribute 'foo'
  1. TypeError:此错误在使用错误数量或类型的参数调用函数或方法时发生。要解决此错误,请确保使用正确数量和类型的参数调用函数或方法。
class MyClass:
    def __init__(self, val):
        self.value = val

    def add(self, num):
        return self.value + num

obj = MyClass(5)
print(obj.add(3))  # Output: 8

# print(obj.add("3"))  Output: TypeError: unsupported operand type(s) for +: 'int' and 'str'

如何获取对象的属性

Python 对象类型具有表示对象特征或行为的属性。要获取 Python 中对象的全部属性,可以使用 getattr() 函数或使用点表示法直接访问它们。

使用 getattr() 函数

getattr() 函数接受两个参数,对象和属性 name,并返回属性的值。

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

my_obj = MyClass('John', 30)
name = getattr(my_obj, 'name')
print(name) # Output: 'John'

直接访问属性

您还可以使用点表示法直接访问对象的属性。

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

my_obj = MyClass('John', 30)
name = my_obj.name
print(name) # Output: 'John'

总之,可以通过使用 getattr() 函数或使用点表示法直接访问它们来获取 Python 对象类型的属性。

探索属性继承和搜索

属性可以从父类继承到子类。属性继承允许子类访问和使用其父类中定义的属性。Python 提供了一个内置函数 issubclass() 来检查给定的类是否是另一个类的子类。

Python 中类的示例

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

class Student(Person):
    def __init__(self, name, age, student_id):
        super().__init__(name, age)
        self.student_id = student_id

在此示例中,StudentPerson 的子类。Student 类从 Person 类继承 nameage 属性。

属性继承

class A:
    x = 10

class B(A):
    pass

class C(B):
    pass

print(B.x)   # 10

print(C.x)   # 10

在此示例中,A 是父类,B 是子类,C 是孙子类。在 A 类中定义的 x 属性被 BC 类继承。

属性搜索顺序

class A:
    x = 10

class B(A):
    x = 20

class C(B):
    pass

print(C.x)   ### Output 20

在此示例中,A 是父类,B 是子类,C 是孙子类。AB 类都有一个名为 x 的属性。在这种情况下,属性搜索顺序是从当前类(即 C)到其父类 B,最后到祖父母类 A。在最近的祖先(B)中找到的 x 的值作为输出打印。

如何打印所有对象属性

要获取 Python 中对象的属性,可以使用内置 dir 函数。要打印对象属性,您需要迭代 dir 函数的输出并使用 getattr 函数获取属性的值。以下两个代码示例

class MyClass:
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar
        
my_obj = MyClass(5, "hello")

### using the dir function

for attr in dir(my_obj):
    print(f"{attr}: {getattr(my_obj, attr)}")
class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city
        
person_obj = Person("John", 30, "New York")

### using list comprehension

attrs = [attr for attr in dir(person_obj) if not callable(getattr(person_obj, attr)) and not attr.startswith("__")]
for attr in attrs:
    print(f"{attr}: {getattr(person_obj, attr)}")

在两个示例中,dir 函数用于获取对象的全部属性的列表。第一个示例使用简单的 for 循环来迭代列表并使用 getattr 函数打印每个属性及其 value。第二个示例使用列表解析来过滤掉任何 callable 属性(例如方法)和任何以两个下划线开头的属性(这些属性被认为是私有的)。然后使用 getattr 打印属性的结果列表。

如何在 Python 中检查对象的类型

在 Python 中,你可以使用 type() 函数来检查对象的 type。此函数返回你作为参数传递的对象的 type。以下两个示例说明了如何使用 type() 函数

# Checking the type of an integer
number = 42
print(type(number))  # Output: <class 'int'>
# Checking the type of a list
fruits = ['apple', 'banana', 'cherry']
print(type(fruits))  # Output: <class 'list'>

使用 type() 函数可以让你快速轻松地获取任何 Python 对象的 type。当你想调试你的代码或基于对象的 type 编写条件 语句 时,这会很有用。

序列化对象

Python 中的序列化是指将 Python 对象转换为字节流的过程。当在不同系统之间传输数据或将程序状态保存到磁盘时,这会很有用。Python 中最常见的序列化模块是 pickle,它可以序列化大多数 Python 对象。

以下是两个使用 pickle 在 Python 中序列化对象的示例

import pickle
my_dict = {'key': 'value'}
with open('serialized_dict.pickle', 'wb') as f:
    pickle.dump(my_dict, f)

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

my_object = MyClass('hello')
serialized_object = pickle.dumps(my_object)

在第一个案例中,我们创建一个字典对象,并使用 pickle.dump() 将其转储到文件中。在第二个案例中,我们创建一个 MyClass 实例,并使用 pickle.dumps() 将其序列化为字节字符串。

使用 pickle 进行 Python 对象序列化既简单又强大。但是,请注意 pickle 并不安全,不应将其用于序列化或反序列化不受信任的数据。

错误:Python 对象没有属性

当你在 Python 中遇到一条显示 Python Object has no Attribute 的错误消息时,这意味着你正在尝试访问该对象中不存在的属性或方法。这可能是由于属性名称中出现错别字或使用错误的变量来访问属性。

以下是此错误如何发生以及如何修复它的两个示例

class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model

my_car = Car('Toyota', 'Camry')
print(my_car.color)

# Output:
# 
# AttributeError: 'Car' object has no attribute 'color'

解释:在此示例中,我们尝试访问 my_car 对象中不存在的属性“color”。

要修复此错误,你需要将 color 属性添加到 Car 类中或使用现有属性。

class Car:
    def __init__(self, make, model, color):
        self.make = make
        self.model = model
        self.color = color

my_car = Car('Toyota', 'Camry', 'red')
print(my_car.color)

# Output:
# 
# 'red'
def get_average(numbers):
    total = 0
    for num in numbers:
        total += num
    return total / len(numbers)

my_nums = [1, 2, 3, '4', 5] 
average = get_average(my_nums)

# Output:
# 
# TypeError: unsupported operand type(s) for +=: 'int' and 'str'

解释:在此示例中,我们尝试将字符串 value 添加到 total 变量中,这会导致错误,因为 numeric() 方法仅适用于数值。

要修复此错误,你可以在将 value 添加到 total 变量之前使用 isinstance() 函数来检查 if 是否为数值。

def get_average(numbers):
    total = 0
    count = 0
    for num in numbers:
        if isinstance(num, (int, float)):
            total += num
            count += 1
    return total / count

my_nums = [1, 2, 3, '4', 5] 
average = get_average(my_nums)
print(average)

# Output:
# 
# 2.75

如何列出类中可用的方法

在 Python 中,你可以使用 dir()vars() 函数列出类中所有可用的方法。这些 函数 允许你内省你的类并查看它包含的所有方法和属性。

使用 dir() 函数

class MyClass:
    def __init__(self):
        self.my_var = "Hello world"
        
    def my_method(self):
        print("My Method")

print(dir(MyClass))

# Output:
# 
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', 
# '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
# '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__',
# '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
# '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
#  'my_method']

使用 vars() 函数

class MyClass:
    def __init__(self):
        self.my_var = "Hello world"
        
    def my_method(self):
        print("My Method")

print(vars(MyClass))

# Output:
# 
# {'__module__': '__main__', '__init__': <function MyClass.__init__ at 0x7f1f9f0bd430>, 
#  'my_method': <function MyClass.my_method at 0x7f1f9f0bd4c0>, '__dict__':
# <u>attribute '__dict__' of 'MyClass' objects</u>, '__weakref__':
# <u>attribute '__weakref__' of 'MyClass' objects</u>, '__doc__': None}

使用这些函数可以帮助你了解类的结构以及如何与之交互。

与我们一起贡献!

不要犹豫,在 GitHub 上为 Python 教程做出贡献:创建分支,更新内容并发出拉取请求。

Profile picture for user AliaksandrSumich
Python 工程师,第三方 Web 服务集成专家。
更新:05/03/2024 - 21:52
Profile picture for user angarsky
已审阅并批准