面向对象OOP概念

news/2024/12/25 15:12:06/文章来源:https://www.cnblogs.com/yangfan65/p/18623238

一、类的概念

1. 在编程中,有一种范式遵循与蓝图和实例相同的原则。它被称为面向对象编程 (OOP)。在 OOP 中,蓝图称为类(class),实例称为对象(object)。

在 Python 中,可以使用 class 关键字+类名+冒号来定义一个类。

示例:

class Car:

 

2. 要向类添加属性,必须定义 __init__ 方法。此方法的第一个参数始终是 self,它表示类的实例。在 self 之后,指定要包含的属性。然后,在函数内部,为初始化对象的属性赋值,设置它们的初始状态。

示例1:

class Car:

  #初始化属性

  def __init__(self, brand, color): #第一个属性必须是self

 

    self.brand = brand

    self.color = color

#实例化对象

my_car = Car("Audi", "blue")

print(my_car) #跟java一样,对象无法直接打印

print(my_car.brand)

 

 

示例2:

 

class Car():

  def __init__(self, brand, model, color):
    self.brand = brand
    self.model = model
    self.color = color

 

 

3. 除了属性之外,您还可以通过在类中定义函数来向类添加自定义行为。这些函数称为方法,应包含“self”参数以与类实例进行交互。您可以使用点 . 表示法来调用这些方法,类似于访问属性的方式。

class Car:

  def __init__(self, brand, color): #第一个属性必须是self

 

    self.brand = brand

    self.color = color

  def honk(self):

    print("Beep, beep!")

my_car = Car("Audi", "blue")

my_car.honk()  #Beep, beep!

函数和方法之间的主要区别在于,函数是独立的,可以自行调用,而方法与类相关联,只能通过其实例调用。这意味着,如果没有定义该方法的类的实例,则无法调用该方法。

 

二、继承

了解继承的原理,这是一种可以增强程序的多功能性和效率的 OOP 概念。

继承是一个关键概念,适用于以下情况:有一个具有已定义属性和行为的现有类,而需要一个不仅具有这些特征而且具有自己独特特征的新类。继承允许新类从现有类“继承”属性,同时根据需要添加或修改特定功能。

继承自其他类的类称为超类(superclass)或父类(parent)。相反,继承自其他类的类称为子类(subclass)或子类(child)。

class Animal:

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

    print("Moving")
# Inherits from Animal class
class Dog(Animal): #定义子类时,将父类名称放在括号中。
# Specific behavior
  def bark(self):

  print("Woof!")
# Creating an instance
my_dog = Dog("Bob")
# Inherited attribute and behavior
print(my_dog.name)
my_dog.move()
# Specific behavior
my_dog.bark()

 

如果我们不仅想继承属性,还想为子类添加特定属性,该怎么办?在这种情况下,我们在子类中定义一个 __init__ 方法。使用 super().__init__() 从父类继承属性,然后像往常一样定义任何其他属性。

#parent class
class Animal:

  def __init__ (self, name):

    self.name = name
  def move(self):

    print("Moving")
#child class
class Dog(Animal):
  def __init__ (self, name, breed, age):
# Initialize attributes of the superclass

    super(). init (name)
# Additional attributes specific to Dog

    self.breed = breed

    self.age = age
  def bark(self):

    print("Woof!")
my_dog = Dog("Jax", "Bulldog", 5) #inherited attribute

print(my_dog.name)
#Additional attributes

print(my_dog.breed)

print(my_dog.age)

 

方法覆盖是OOP中另一个关键概念——多态的演示。多态性允许对象以自己的方式使用方法,即使它们共享相同的名称。

在本例中,尽管animals列表中的每种动物可能属于不同的子类,但代码可以对每种动物调用sound(),而无需知道其特定类型。

# Parent class
class Animal:
  def init (self, name):
    self.name = name
# Generic sound method for any animal

  def sound(self):
    print("Making a sound")
# Child class Dog
class Dog(Animal):
  def init (self, name, breed, age):
    super(). init (name)
    self.breed = breed
    self.age = age
# Overridden sound method for Dog
  def sound (self):

    print("Woof!")
# Child class Cat
class Cat(Animal):
  def init (self, name, breed, age):
    super(). init (name)
    self.breed = breed
    self.age = age
# Overridden sound method for Cat
  def sound(self):

    print("Meow!")
# Creating instances
my_dog = Dog("3ax", "Bulldog", 5)
my_cat = Cat("Lily", "Ragdoll", 2)
animals = [my_dog, my_cat]
for animal in animals:

animal.sound()

 

三、数据隐藏

数据隐藏是使带有对象的代码(如游戏或应用程序)更安全、更清晰的关键思想。这意味着将对象的某些部分保持私有,以便只有某些部分的代码可以更改它们。这有助于防止错误并使代码易于管理。

数据隐藏有助于OOP中的封装,增强代码的安全性和健壮性。

在编程中,有时“保护”某些类属性和方法不被类外部访问是至关重要的。这被称为数据隐藏,并确保数据的完整性和安全性,防止意外或有害的修改。

在Python中,数据隐藏有两个级别。第一种方法是在属性前加上一个下划线_,表示它只用于内部使用,应该被视为“受保护的”。

让我们使用odometer属性进行此更改:

class Car:
  def __init__ (self, model, year, odometer):

    self.model = model
    self.year = year
# Making the odometer attribute 'protected' 加单下划线用于保护

    self._odometer = odometer
  def describe_car(self):

    print(self.year, self.model)
  def read_odometer(self):
    print("Odometer:", self._odometer, "miles")
my_car = Car('Audi’, 2020, 15000)
my_car.describe_car()
my_car.read_odometer()

 

带有单个下划线的属性是可访问的,但被认为是受约定保护的,表明它们是供内部使用的,应该在类外部谨慎访问。

要访问类外部的受保护属性,请使用单个下划线前缀,因为这是属性名称的一部分。

class Car:
  def __init__ (self, model, year, odometer):

    self.model = model
    self.year = year
# Making the odometer attribute 'protected'

    self._odometer = odometer
  def describe_car(self):

    print(self.year, self.model)
  def read_odometer(self):
    print("Odometer:", self._odometer, "miles")
my_car = Car("Audi", 2020, 15000)
#accessing the protected attribute
print(my_car._odometer)

 

数据隐藏的下一层涉及将属性设置为私有。这是通过在属性名前加上两个下划线来实现的(例如,__attribute)。在这种情况下,与受保护的属性不同,这不仅仅是一种约定——它通过名称混淆限制了它在类外部的访问,从而增强了数据保护和封装。此方法用于敏感或内部数据,强烈阻止外部访问。

class Car:
  def __init__(self, model, year, odometer):
    self.model = model
    self.year = year
    # Making the odometer attribute 'private'
    self.__odometer = odometer

 

从类外部访问带有双下划线的私有属性会导致错误,但可以在类方法中访问它。这演示了封装,保护敏感数据不受外部访问,并确保它只能通过特定的方法访问,与面向对象编程原则保持一致。

class Car:
  def __init__(self, model, year, odometer):

    self.model = model
    self.year = year
    # Making the odometer attribute 'private'

    self.__odometer = odometer
  def describe_car(self):

    print(self.year, self.model)
  def read_odometer(self):

    print("Odometer:", self.__odometer, "miles")


my_car = Car('Audi’, 2020, 15000)


#accessing the attribute within method
my_car.read_odometer()


#error
print(mycar.__odometer)

 

在Python中,通常不鼓励直接从类外部访问私有属性。但是,Python对私有属性使用了名称混淆,这意味着您可以在必要时从类外部使用特定的命名约定访问它们。

class Car:

  def __init__(self, model, year, odometer):

    self.model = model

      self.year = year
   # Making the odometer attribute 'private'
   self.__odometer = odometer

def describe_car(self):
print(self.year, self.model)

def read_odometer(self):
print("Odometer:", self.__odometer, "miles")

my_car = Car("Audi", 2020, 15000)
# accesing using name mangling
print(my_car._Car__odometer)

总结:

🌟数据隐藏是面向对象编程的关键,用于编写安全和有组织的代码

🌟使用单个下划线(_)表示属性或方法是受保护的,仅供内部使用

🌟双下划线(__)使属性或方法私有,限制对类本身的访问,从而增强了数据安全性

🌟这些约定有助于管理访问并在代码中保持清晰的结构

 

类方法在类本身上调用,而不是在单个实例上调用。这允许在不创建类实例的情况下使用它们。它们对于与整个类相关的操作特别有用,而不是仅限于单个对象的操作。

类方法是使用@classmethod装饰器创建的,并接受cls参数,该参数引用类本身。

要调用类方法,不需要创建类的实例。相反,只需使用类名,后跟一个点和类方法名。

class Book:
  def __init__(self, title, author):

    self.title = title

    self.author = author
  #regular method
  def describe_book(self):

    print(self.title, 'by', self.author)
  #class method

  @classmethod

  def books_in_series(cls, series_name, number_of_books):

    print("There are", number_of_books, "books in the", series_name, "series")
# Creating an instance of Book
my_book = Book("Harry Potter and the Sorcerer's Stone", "J.K. Rowling")
# Using the instance method to describe the book

my_book.describe_book()


# Using the class method to display information about the series(不需要创建实例)

Book.books_in_series("Harry Potter", 7)

 

实例共享类所拥有的一切,包括类的方法。这意味着您还需要在实例上调用类方法。

class Book:
  def __init__(self, title, author):

    self.title = title

    self.author = author
  #regular method
  def describe_book(self):

    print(self.title, 'by', self.author)
  #class method

  @classmethod

  def books_in_series(cls, series_name, number_of_books):

    print("There are", number_of_books, "books in the", series_name, "series")
# Creating an instance of Book
my_book = Book("Harry Potter and the Sorcerer's Stone", "J.K. Rowling")
# Using the instance method to describe the book

my_book.describe_book()


# calling the class method on the instance(需要创建实例)

my_book.books_in_series("Harry Potter", 7)

 

静态方法类似于类方法,除了它们不接受任何额外的参数;它们与属于类的普通函数相同。

它们被标记为@staticmethod装饰器。

class Book:
  def __init__(self, title, author):

    self.title = title

    self.author = author
  #regular method
  def describe_book(self):

    print(self.title, 'by', self.author)
  #static method

  @staticmethod

  def books_in_series(series_name, number_of_books): #与classmethod相比,没有cls参数

    print("There are", number_of_books, "books in the", series_name, "series")
# Creating an instance of Book
my_book = Book("Harry Potter and the Sorcerer's Stone", "J.K. Rowling")
# Using the instance method to describe the book

my_book.describe_book()


# calling the static method

my_book.books_in_series("Harry Potter", 7)

什么时候应该使用静态方法而不是类方法?静态方法不接受cls参数,这意味着它们不能访问或修改类的状态。当您需要的功能不依赖于类的行为或实例状态并且不影响它时,它们非常有用。本质上,静态方法适合于自包含的任务,不需要了解类或实例。

总结:

🌟类方法在类本身上调用,而不是在单个实例上调用

🌟类方法使用@classmethod装饰器定义,并接受cls参数

🌟使用@staticmethod装饰器定义的静态方法类似于类方法,但不能访问类的状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858661.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

门店协作的未来:协作文档如何提升客户体验?

汽车销售是一种高竞争、高需求精细化管理的业务形态。门店销售团队不仅需要对接客户,还要实时反馈总部的策略与数据。如果销售流程中协同效率不足,往往会导致商机流失和客户满意度下降。协作文档工具的普及,为车企门店带来了全新解决方案。 车企门店销售面临的核心问题 在车…

功率器件的热设计基础(二)——热阻的串联和并联

功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的热设计基础知识,才能完成精确热设计,提高功率器件的利用率,降低系统成本,并保证系统的可靠性。/ 前言 / 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的热设计…

视频分析设备平台EasyCVR关于未来监控系统可能会集成哪些新技术?

随着科技的飞速发展,监控系统正经历着一场革命性的变革。未来的监控系统将不再是单一的观察和记录工具,而是集成了多种前沿技术的智能平台,它们将极大地提高安全性、效率和响应速度。以下是未来监控系统可能集成的一些关键技术。1、人工智能技术 1)监控系统将越来越多地应用…

【亲测能用】专业音乐制作软件Ableton Live Suite v12.1.5 中文版(附安装教程)

软件介绍 在数字音频工作站(DAW)的领域中,Ableton Live以其创新和灵活性脱颖而出,成为全球音乐家和制作人的首选工具。由德国Ableton公司精心打造,这款软件不仅支持无缝的音乐播放和即时编辑,还提供了强大的音频效果和虚拟乐器,让音乐创作变得无限可能。 功能亮点 Ablet…

【测试侧】产品场景用例模板

产品的场景法用例设计的测试场景用例模板

宝藏推荐!J 人电商零售圣诞忙,哪 6 款办公软件能提升工作学习效能?

圣诞节的钟声敲响,电商零售行业瞬间陷入紧张而激烈的竞争漩涡。对于 J 人特质主导的电商团队而言,这不仅是一场销售大战,更是对团队协作与个人能力的严峻考验。在这关键时期,高效的办公软件犹如得力助手,能够帮助团队优化工作流程、提升沟通效率,实现工作与学习的双丰收。…

源码编译geoserver(idea)

官方教程:https://docs.geoserver.org/main/en/developer/quickstart/intellij.html从 git 存储库中检出源代码:git clone https://github.com/geoserver/geoserver.git geoserver列出可用的分支:% git branch2.21.x2.22.x* main选择main最新动态:% git checkout main或者为…

MFC中CBitmap、CBrush、CFont、CPalette、CPen、CRgn删除GDI对象问题

CBitmap、CBrush、CFont、CPalette、CPen、CRgn均继承自CGdiObject,CDI对象属于CGdiObject,在该类的析构函数中会释放,因此CBitmap、CBrush、CFont、CPalette、CPen、CRgn不必要显式调用DeleteObject()。如果GDI对象在在堆上分配的,则在特定时刻需要删除它,以便执行其析构…

【甲方安全】政府行业+80个威胁检测与安全事件分析场景(2025)

本篇幅详细梳理了 80 个在政企网络安全分析中常见的应用场景,这些场景涵盖了从攻击前兆(如漏洞扫描、情报收集)、攻击过程(如漏洞利用、横向移动)到攻击结果(如数据加密、信息泄露)的各个阶段,旨在协助 SOC 分析师们更好地构建主动防御体系。这些场景并非抽象概念,而是…

想自己做大模型备案的企业看过来【评估测试题+备案源文件】

大模型备案,大模型语料标注规则,大模型安全评估报告文章目录 (一)适用主体 (二)语料安全 (三)模型安全 (四)安全措施要求 (五)词库要求 (六)安全评估要求 (七)附录大模型备案材料源文件 2024年3月1日,我国通过了《生成式人工智能服务安全基本要求》(以下简称…

树洞09

情绪很不好,没人能依靠 钱财多有价,感情胜千金 金玉良缘广,木石前盟稀 愿君有真爱,伴君度此生。

qt读写ini文件

[group1]key1=val1key2=val2sameKay=sameVal [group2]jian1=zhi1jian2=zhi2sameKay=sameZhi比如创建插入一组ini文件,下面是文件写入的代码; Ini文件的写入 ini文件不需要像xml和json一样需要使用QFile打开文件,只需将文件路径及文件格式传入即可(下方代码运行完毕,ini文件…