什么是面向对象编程(OOP)
面向对象编程(Object-oriented Programming,简称OOP)是一种编程范例,它提供了一种结构化程序的方法,以便将属性和行为捆绑到单个对象中。
例如,对象可以表示具有姓名属性,年龄,地址等的人,具有行走,说话,呼吸和跑步等行为。或者包含收件人列表,主题,正文等属性的电子邮件,以及添加附件和发送等行为。
换句话说,面向对象编程是一种, 可以为具体现实世界的事物建模的方法,如汽车以及公司和员工,学生和教师等事物之间的关系. OOP将现实世界的实体建模为软件对象,以及与之相关的数据,并可以执行某些功能。
另一种常见的编程范例是函数式编程,其构造类似于顺序执行的程序,因为它以函数和代码块的形式提供一组执行步骤,这些步骤一步步执行以完成任务。
关键的一点是,对象是面向对象编程范例的核心,不仅在函数编程中表示数据,而且在程序的整体结构中也是如此。
Python中的类
首先关注数据,每个事物或对象都是某个类的实例。
Python中可用的原始数据结构(如数字,字符串和列表)旨在分别表示简单的事物,例如某事物的成本,诗歌的名称和您喜欢的颜色。
如果你想代表更复杂的东西怎么办?
例如,假设您想跟踪许多不同的动物。如果您使用了列表,则第一个元素可以是动物的名称,而第二个元素可以表示其年龄。
你怎么知道哪个元素应该是哪个?如果你有100种不同的动物怎么办?你确定每只动物都有名字和年龄,等等吗?如果你想为这些动物添加其他属性怎么办?这就是为什么我们需要一个"类"(Class)。
类可以用来创建新的用户定义的数据结构,其中包含有关内容的任意信息。对于动物,我们可以创建一个Animal( )类来跟踪关于Animal的属性,如名称和年龄。
注意, 一个类只提供结构 - 它是应该如何定义某个东西的蓝图,但它实际上并不提供任何真实的内容. Animal( )类可以指定名称和年龄, 是定义动物所必需的,但它实际上不会包含特定动物的名字或年龄。
可以将"类"视为"某事物的定义".
Python对象(实例)
虽然类是蓝图,但实例是具有实际值的类的副本,字面上是属于特定类的对象。这不再是一个想法;它是一只真正的动物,就像一只名叫罗杰的狗,已经八岁了。
换句话说,类就像一个表格或问卷。它定义了所需的信息。填写表格后,您的特定副本就是该类的一个实例;它包含与您相关的实际信息。
您可以填写多个副本以创建许多不同的实例,但如果没有表单作为指导,您将会彻底迷失,不知道需要哪些信息。因此,在创建对象的单个实例之前,我们必须首先通过定义类来指定所需的内容。
如何在Python中定义类
class Dog:
pass
实例属性
所有类都需要创建对象,所有对象都包含称为属性的特征(在开头段落中称为属性)。使用__init __()方法通过为对象的初始属性提供其默认值(或状态)来初始化(例如,指定)对象的初始属性。此方法必须至少有一个参数以及自变量,它引用对象本身(例如,Dog)。
class Dog:
# Initializer / Instance Attributes
def __init__(self, name, age):
self.name = name
self.age = age
类属性
虽然实例属性特定于每个对象,但类属性对于所有实例都是相同的 - 在这种情况下,属性都来自狗。
class Dog:
# Class Attribute
species = 'mammal'
# Initializer / Instance Attributes
def __init__(self, name, age):
self.name = name
self.age = age
「封装」,「继承」和「多态」
「封装」
「封装」是面向对象编程中的一个概念,它指的是将数据和方法包装在一个单独的单元中,以便在外部无法直接访问或修改内部数据。这种数据保护的方式可以防止外部代码意外地修改或破坏内部数据,从而提高了代码的可靠性和安全性。
在Python中,封装通常通过使用类和访问修饰符来实现。访问修饰符是一种关键字,用于控制类中的属性和方法的可见性。Python中有两种访问修饰符:公共修饰符和私有修饰符。公共修饰符表示属性或方法可以从类的任何地方访问,而私有修饰符表示属性或方法只能从类内部访问。
以下是一个简单的示例,演示了如何在Python中使用封装:
class MyClass:
def __init__(self, name, age):
self.name = name
self.__age = age
def get_age(self):
return self.__age
def set_age(self, age):
if age > 0:
self.__age = age
my_object = MyClass("Alice", 25)
print(my_object.name) # 打印 "Alice"
print(my_object.get_age()) # 打印 "25"
my_object.set_age(-10) # 年龄不能为负数
print(my_object.get_age()) # 打印 "25"
my_object.set_age(30)
print(my_object.get_age()) # 打印 "30"
#在这个例子中,MyClass
类有两个属性:name
和__age
。name
是公共属性,可以从类的任何地方访问。__age
是私有属性,只能从类内部访问。MyClass
类还有两个方法:get_age
和set_age
继承
继承是面向对象编程中的一个重要概念,它指的是一个类可以从另一个类中继承属性和方法。被继承的类称为父类或超类,继承的类称为子类或派生类。子类可以使用父类中的属性和方法,也可以添加自己的属性和方法。
在Python中,使用关键字class来定义一个类,并使用括号指定父类。如果没有指定父类,则默认继承自object类。以下是一个简单的示例,演示了如何在Python中使用继承:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def speak(self):
return"Woof"
class Cat(Animal):
def speak(self):
return"Meow"
my_dog = Dog("Rufus")
my_cat = Cat("Fluffy")
print(my_dog.name + " says " + my_dog.speak()) # 打印 "Rufus says Woof"
print(my_cat.name + " says " + my_cat.speak()) # 打印 "Fluffy says Meow"
多态
多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等。(一个抽象类有多个子类,因而多态的概念依赖于继承)
import abc
class Animal(metaclass=abc.ABCMeta):#同一类事物:动物
@abc.abstractmethod
def talk(self):
pass
class Cat(Animal):#动物的形态之一:猫
def talk(self):
print('say miaomiao')
class Dog(Animal):#动物的形态之二:狗
def talk(self):
print('say wangwang')
class Pig(Animal):#动物的形态之三:猪
def talk(self):
print('say aoao')