首页 > 编程语言 >跟着查老四学Python Day 8:面向对象编程

跟着查老四学Python Day 8:面向对象编程

时间:2023-04-13 16:46:45浏览次数:39  
标签:__ name Python self 实例 面向对象编程 方法 Day 属性

面向对象编程基本概念

日常寒暄之后,查老四开始讲课了

查老四:好的,我会尽量满足你的要求。现在我们开始第一节:面向对象编程。

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它提倡将现实世界中的事物抽象为程序中的类(Class)和对象(Object),通过封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)等机制来设计和实现代码。这样做的目的是让代码更加模块化、可复用和易于维护。

  1. 类(Class):类是对具有相同特征(属性)和行为(方法)的一组对象的抽象。它是创建对象的模板。
  2. 对象(Object):对象是类的实例。一个类可以创建多个对象,每个对象都有其自己的属性和方法。通常情况下,我们使用对象来表示现实世界中的某个具体事物。
  3. 属性(Attribute):属性用于描述对象的特征。它们通常是类或对象的变量。例如,一个人类的属性可能包括姓名、年龄、身高等。
  4. 方法(Method):方法是类或对象可以执行的操作。它们通常是类或对象的函数。例如,一个人类的方法可能包括跑步、吃饭、睡觉等。

接下来,我们通过一个简单的示例来演示如何在Python中定义一个类以及如何创建类的实例。

# 定义一个名为Person的类
class Person:
    # 类的属性
    species = "Homo sapiens"

    # 类的方法
    def greet(self, name):
        return f"Hello, {name}! I am a {self.species}."

# 创建一个Person类的实例
person = Person()

# 调用类的方法
greeting = person.greet("老猫")
print(greeting)  # 输出:Hello, 老猫! I am a Homo sapiens.

现在,请尝试自己创建一个类,并为其添加一些属性和方法。然后,创建一个该类的实例并调用其方法。完成后,我们将继续讲解如何定义和访问类的属性和方法。

练习:

下面是一个简单的类示例,包括属性和方法的定义。我将创建一个名为 Person 的类,并为其添加构造方法、属性以及一个方法。

class Person:
    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.")

# 创建一个 Person 类的实例
person1 = Person("Alice", 30)

# 调用 greet 方法
person1.greet()

在这个示例中,我们创建了一个名为 Person 的类。它有两个属性:nameage,分别在 __init__ 方法中进行初始化。我们还定义了一个名为 greet 的方法,它使用 f-string 格式化字符串打印一条包含姓名和年龄的问候语。

然后,我们创建了一个 Person 类的实例 person1,并为其赋予了 "Alice" 和 30 这两个属性值。最后,通过调用 person1.greet() 方法,我们可以看到输出的问候语。

老猫:请公布答案。

查老四:这是一个示例答案,以动物类(Animal)为例。你可以参考这个答案,但请记住,你可以根据自己的想法创建任何类。

# 定义一个名为Animal的类
class Animal:
    # 类的属性
    kingdom = "Animalia"

    # 类的方法
    def describe(self, animal_name):
        return f"{animal_name} belongs to the kingdom {self.kingdom}."

# 创建一个Animal类的实例
animal = Animal()

# 调用类的方法
description = animal.describe("Cat")
print(description)  # 输出:Cat belongs to the kingdom Animalia.

这个示例中,我们定义了一个名为Animal的类,它有一个属性kingdom和一个方法describe。我们创建了一个Animal类的实例,并调用了它的describe方法来输出动物所属的界(Kingdom)。

在你理解了这个示例之后,我们将继续学习如何定义和访问类的属性和方法.


老猫:代码中出现的self是啥意思

查老四:在Python类中,self是一个指向实例对象本身的引用。当你在类中定义方法时,通常需要将self作为方法的第一个参数。这样,你可以在方法内部访问和修改实例的属性和调用其他实例方法。

这里有一个简单的例子来帮助你理解self的作用:

class Dog:
    # 类的初始化方法,用于设置实例属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 类的方法,使用self访问实例属性
    def bark(self):
        return f"{self.name} says 'Woof!'"

# 创建一个Dog类的实例
dog = Dog("Buddy", 3)

# 调用实例方法
bark_sound = dog.bark()
print(bark_sound)  # 输出:Buddy says 'Woof!'

在这个例子中,我们定义了一个Dog类,它有一个__init__方法和一个bark方法。__init__方法是一个特殊的方法,当创建类的实例时,它会自动被调用。在__init__方法中,我们使用self.nameself.age来设置实例属性。在bark方法中,我们使用self.name来访问实例的属性name

当我们创建Dog类的实例并调用其bark方法时,self参数就指向了创建的dog实例。这样,我们可以在bark方法中访问dog实例的属性和其他方法。


定义和访问类的属性和方法

定义类的属性

在Python中,类的属性可以分为两种:实例属性和类属性。

  1. 实例属性:实例属性是每个对象实例特有的属性。它们在__init__方法或其他实例方法中使用self.属性名的形式定义。实例属性可以具有不同的值,取决于具体的对象实例。
class Dog:
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age    # 实例属性
  1. 类属性:类属性是类本身的属性,它们对类的所有实例共享。类属性在类定义内部,但在任何方法之外使用类名.属性名的形式定义。类属性具有相同的值,无论创建了多少个对象实例。
class Dog:
    species = "Canis lupus familiaris"  # 类属性

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

定义类的方法

类的方法是类或对象可以执行的操作。在Python中,类的方法分为实例方法、类方法和静态方法。

  1. 实例方法:实例方法是最常见的方法类型,它需要将self作为第一个参数。实例方法可以访问和修改实例属性,并且可以调用其他实例方法
class Dog:
    # ...
    
    def bark(self):  # 实例方法
        return f"{self.name} says 'Woof!'"
  1. 类方法:类方法用@classmethod装饰器声明,并将类本身作为第一个参数(通常命名为cls)。类方法不能访问实例属性,但可以访问类属性。
class Dog:
    # ...
    
    @classmethod
    def get_species(cls):  # 类方法
        return cls.species
  1. 静态方法:静态方法用@staticmethod装饰器声明,它不需要传递selfcls参数。静态方法不能访问实例属性或类属性,它们通常用于执行与类相关但不依赖于实例状态的操作。
class Dog:
    # ...
    
    @staticmethod
    def make_sound():  # 静态方法
        return "Woof!"

访问类的属性和方法

要访问实例属性,你可以使用实例名.属性名的形式。要调用实例方法,你可以使用实例名.方法名()的形式。同样,要访问类属性和类方法,你可以使用类名.属性名类名.方法名()的形式。

这是一个完整的示例,演示如何定义和访问类的属性和方法:

class Dog:
    species = "Canis lupus familiaris"  # 类属性

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

    def bark(self):  # 实例方法
        return f"{self.name} says 'Woof!'"

    @classmethod
    def get_species(cls):  # 类方法
        return cls.species

    @staticmethod
    def make_sound():  # 静态方法
        return "Woof!"

# 创建一个Dog类的实例
dog = Dog("Buddy", 3)

# 访问实例属性
print(dog.name)  # 输出:Buddy
print(dog.age)   # 输出:3

# 调用实例方法
print(dog.bark())  # 输出:Buddy says 'Woof!'

# 访问类属性
print(Dog.species)  # 输出:Canis lupus familiaris

# 调用类方法
print(Dog.get_species())  # 输出:Canis lupus familiaris

# 调用静态方法
print(Dog.make_sound())  # 输出:Woof!

在这个示例中,我们定义了一个名为Dog的类,其中包含一个类属性species,两个实例属性nameage,一个实例方法bark,一个类方法get_species和一个静态方法make_sound。我们创建了一个Dog类的实例,并展示了如何访问实例属性、类属性以及如何调用实例方法、类方法和静态方法.

好的,现在我们已经学会了如何定义和访问类的属性和方法,接下来我们会动手编写一个简单的面向对象Python程序,以加深对面向对象编程基础知识的理解。

我们将创建一个表示几何形状的程序,包括圆形和矩形。这个例子将帮助你理解如何使用类来表示现实世界中的对象以及如何使用类的属性和方法来操作这些对象。

首先,我们创建一个表示圆形的类:

import math

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

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

    def circumference(self):
        return 2 * math.pi * self.radius

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

# 计算圆的面积和周长
circle_area = circle.area()
circle_circumference = circle.circumference()

print(f"Circle area: {circle_area:.2f}")
print(f"Circle circumference: {circle_circumference:.2f}")

然后,我们创建一个表示矩形的类:

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def perimeter(self):
        return 2 * (self.width + self.height)

# 创建一个Rectangle类的实例
rectangle = Rectangle(4, 6)

# 计算矩形的面积和周长
rectangle_area = rectangle.area()
rectangle_perimeter = rectangle.perimeter()

print(f"Rectangle area: {rectangle_area:.2f}")
print(f"Rectangle perimeter: {rectangle_perimeter:.2f}")

这个例子展示了如何使用面向对象编程的思想来表示和操作几何形状。我们为圆形和矩形创建了两个类,分别定义了它们的属性和方法。这种方式使得代码更加易于理解和维护。

现在,你可以尝试自己编写一些类,以加深对面向对象编程基础知识的理解。如果你遇到问题,随时提问。

练习: 下面是一个名为 Cylinder 的类示例,用于表示圆柱形的基本几何特性。这个类包含用于计算体积的方法。

import math

class Cylinder:
    def __init__(self, radius, height):
        self.radius = radius
        self.height = height

    def volume(self):
        return math.pi * self.radius ** 2 * self.height

# 创建一个 Cylinder 类的实例
cylinder1 = Cylinder(3, 5)

# 计算并打印圆柱体积
print(f"Volume: {cylinder1.volume()}")

在这个示例中,我们创建了一个名为 Cylinder 的类。它具有两个属性:radiusheight,分别在 __init__ 方法中进行初始化。我们还定义了一个名为 volume 的方法,用于计算圆柱体积。该计算使用公式 V = π * r² * h,其中 V 是体积,r 是半径,h 是高度。

然后,我们创建了一个 Cylinder 类的实例 cylinder1,并为其设置半径为 3 和高度为 5。最后,通过调用 cylinder1.volume() 方法,我们可以看到输出的圆柱体积。

对了答案,查老四说还行


老猫:那我们继续今天后面的课程吧

查老四:好的,我们已经完成了第一天的课程内容:面向对象编程基础。为了帮助你巩固今天学到的知识,我将提供一个练习题供你完成。这个练习将涉及到我们今天所学的所有概念。

练习题:创建一个表示银行账户的类,要求具有以下功能:

  1. 属性:账户持有人(owner)、账户余额(balance)。
  2. 方法:存款(deposit)、取款(withdraw)和显示账户信息(show_account_info)。
  3. 存款和取款操作需要检查金额是否合法(不能为负数),取款还需要检查余额是否足够。

请根据这些要求,编写一个BankAccount类,并创建一个实例进行测试。

完成后,我会帮助你检查代码并给出反馈。如果你在编写代码过程中遇到问题,也可以随时向我请教。

练习: 下面是一个表示银行账户的 BankAccount 类示例,包含了属性和方法的定义。

class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance

    def deposit(self, amount):
        if amount < 0:
            print("Amount must be positive.")
            return
        self.balance += amount
        print(f"Deposited: {amount}, New balance: {self.balance}")

    def withdraw(self, amount):
        if amount < 0:
            print("Amount must be positive.")
            return
        if amount > self.balance:
            print("Insufficient balance.")
            return
        self.balance -= amount
        print(f"Withdrawn: {amount}, New balance: {self.balance}")

    def show_account_info(self):
        print(f"Owner: {self.owner}, Balance: {self.balance}")

# 创建一个 BankAccount 类的实例
account1 = BankAccount("Alice", 1000)

# 进行存款、取款操作并显示账户信息
account1.show_account_info()
account1.deposit(500)
account1.withdraw(300)
account1.withdraw(1500)
account1.show_account_info()

在这个示例中,我们创建了一个名为 BankAccount 的类。它有两个属性:owner(账户持有人)和 balance(账户余额),分别在 __init__ 方法中初始化。我们还定义了三个方法:

  1. deposit 存款方法:检查存款金额是否合法(不能为负数),如果合法则更新余额。
  2. withdraw 取款方法:检查取款金额是否合法(不能为负数)以及余额是否充足,如果条件满足则更新余额。
  3. show_account_info 显示账户信息方法:打印账户持有人和当前余额。

然后,我们创建了一个 BankAccount 类的实例 account1,并为其设置初始持有人和余额。接着进行了一系列存款和取款操作,并在操作前后调用 show_account_info() 方法显示账户信息。

对了答案,基本一致

标签:__,name,Python,self,实例,面向对象编程,方法,Day,属性
From: https://blog.51cto.com/cloudzun/6188121

相关文章

  • 跟着查老四学Python Day 9:继承和多态
    继承例行寒暄之后,课程正式开始查老四:继承是面向对象编程中的一个重要概念。它允许我们创建一个新类,继承一个现有类的属性和方法,从而实现代码的重用。新类被称为子类,现有类被称为父类。在Python中,通过在子类名后的括号中写入父类名来实现继承。下面是一个简单的示例#父类classAni......
  • docker----day04()
    面试如何自定制上下文管理器#一个对象如果实现了__enter__和___exit__方法,那么这个对象就支持上下文管理协议,即with语句##上节回顾```python#1docker启动,停止,查看状态命令 systemctlstartdockersystemctlstopdockersystemctlstatusdockerd......
  • 跟着查老四学Python Day 11:类的高级特性
    学习类的特殊方法例行寒暄之后,查老四开始了几天的课程查老师:1.学习类的特殊方法,例如__init__、__str__、__repr__等Python中的类可以具有一些特殊方法,这些方法具有双下划线前缀和后缀,例如__init__、__str__和__repr__等。它们在特定情况下被自动调用。__init__:当创建类的实例时,会......
  • 面向对象编程 -- 创建对象1
    面向对象编程 --创建对象1//虽然使用Object构造函数或对象字面量可以方便地创建对象,但这些方式也有明显不足:创建具有同样接口的多个对象需要编写很多代码。一、概述//纵观ECMAScript规范的历次发布,每个版本的特性似乎都出人意料。//ECMAScript6开始正式支持类和继......
  • 跟着查老四学Python Day 11:常用 Python 库
    Python库概览例行寒暄之后,查老四就开始授课了老猫:请大致介绍一下Python库查老四:Python库是一组预先编写好的模块或函数,它们可以实现特定功能或解决特定问题。Python有许多库,它们覆盖了各种不同的领域和应用。以下是一些常用Python库的简要介绍:NumPy:一个用于处理数组和矩阵运算的......
  • Python网络爬虫学习实战:爬虫快速入门
    很多同学私信问爬虫的相关教程,想了想,还是专门跟大家出些Python爬虫学习相关的教程,从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行。我们编写网络爬虫最主要的目的是爬......
  • Python Xlwings 同时选择/删除 多个不连续的列
    找了很多次答案最终结果确定如下先调用api.Range选择多列然后删除sht.api.Range("C:E,G:H").Delete()https://blog.csdn.net/weixin_39608134/article/details/111820149https://m.656463.com/wenda/xuanzezhenggelie_568删除单列或连续多列就很简单了不需要调用api也可以sht[......
  • python compile函数用法
    将文本代码编译成Python可执行代码,这个代码对象可以通过eval()或exec()函数执行。compile()函数的语法如下:compile(source,filename,mode,flags=0,dont_inherit=False,optimize=-1)参数说明:source:必选.必须是一个字符串,表示要编译的代码。filename:必选? 表示......
  • Graphs with Python: Overview and Best Libraries
    GraphswithPython:OverviewandBestLibrariesGraphanalysis,interactivevisualizations,andgraphmachinelearning Agraphisarelativelyoldmathematicaldataentitythatisasetofconnectedelements.Sincethegraphisaveryflexiblestructure......
  • python虚拟环境
    Python虚拟环境是一种为Python项目创建隔离的开发环境的方式,能够在单个安装的Python实例中创建多个独立的开发环境。Python虚拟环境将安装到特定目录中,并能够在该目录下管理Python包和依赖项,不会与其他Python项目的开发环境冲突。虚拟环境可以使用`venv`模块来创建。以下是使用......