广州建站外包,wp 企业网站模板,2016响应式网站模板,网站如何续费目录 面向对象基本概念
一、类和对象
类和对象是面向对象骗程的两个核心概念。
在程序开发中#xff0c;要设计一个类#xff0c;通常需要满足一下三个要素:
self详解#xff1a;
对象#xff08;Object#xff09;
魔法方法#xff1a;
类里的一些特殊方法
__in…目录 面向对象基本概念
一、类和对象
类和对象是面向对象骗程的两个核心概念。
在程序开发中要设计一个类通常需要满足一下三个要素:
self详解
对象Object
魔法方法
类里的一些特殊方法
__init__和__del__方法
repr__和__str
运算符的相关魔法方法:
__eq__方法
类属性和对象属性
简单理解类属性是整个类共有的属性对象属性是每个对象实例的属性类属性的值每个对象都一样而对象属性的值每个对象各不相同。
私有属性和方法
获取私有属性的方法
静态方法和类方法
静态方法和类方法均可通过实例和类调用
单例模式
二、封装Encapsulation
三、继承Inheritance
父类中的私有方法和私有属性
四、多态Polymorphism
五、总结 面向对象基本概念 在编程领域面向对象编程OOP是一种广泛使用的编程范式它通过创建对象来模拟现实世界中的实体及其交互。Python作为一种高级编程语言内置了对面向对象编程的全面支持使得开发者能够轻松构建复杂且易于维护的应用程序。本文将详细探讨Python中的面向对象编程包括类、对象、封装、继承和多态等核心概念。 一、类和对象
类和对象是面向对象骗程的两个核心概念。
类Class类是对一群具有相同特征或者行为的事物的一个统称是抽象的不能直接使用.
类是创建对象的蓝图或模板它定义了对象所具有的属性和方法。属性是对象的特征如颜色、大小而方法是对象能够执行的操作如走、跑、叫。
在程序开发中要设计一个类通常需要满足一下三个要素:
1.类名这类事物的名字按照大驼峰命名法(每个单词的首字母大写)起名。2.属性这类事物具有什么样的特征。3.方法这类事物具有什么样的行为。
class Dog: def __init__(self, name, age): self.name name # 实例变量 self.age age def bark(self): print(f{self.name} is barking.)
在这个例子中Dog是一个类它有两个实例变量name和age以及一个方法bark。__init__方法是一个特殊的方法被称为类的构造函数或初始化方法当创建类的新实例时自动调用。
self详解
哪个对象调用了方法方法里的self 指的就是谁。通过self.属性名可以访问到这个对象的属性;通过self.方法名(可以调用这个对象的方法。 代码举例
class Student(object):#这里的object表示Student继承自object类def __init__(self,x,y):self.namexself.ageydef say_hello(self):print(大家好我是,self.name)
#Student(张三,18)这段代码具体做了什么呢
#1.调用__new__方法用来申请内存空间
#2.调用__init__方法传入参数将self指向创建好的内存空间填充数据
#3.变量s1也指向创建好的内存空间
s1Student(张三,18)
s1.say_hello()
s2Student(李四,18)
s2.say_hello()结果 大家好我是 张三 大家好我是 李四 对象Object
对象是类的实例。通过类可以创建多个具有相同属性和方法的对象但每个对象的属性值可能不同。
d1 Dog(Buddy, 3)
d2 Dog(Max, 5) d1.bark() # 输出: Buddy is barking.
d2.bark() # 输出: Max is barking.
魔法方法
类里的一些特殊方法 # 特点: #1.不需要手动调用会在合适的时机自动调用 #2、这些方法都是使用开始使用结束#3.方法名都是系统规定好的在合适的时机自己调用 __init__和__del__方法
__init__创建对象时会自动调用 __del__当对象被销毁时会自动调用这个方法
class Person(object):def __init__(self,name,age):#在创建对象时会自动调用这个方法print(__init__方法被调用了)self.namenameself.ageagedef __del__(self):#当对象被销毁时会自动调用这个方法print(__del__方法被调用了)
pPerson(张三,18)
del p结果 __init__方法被调用了 __del__方法被调用了 repr__和__str
当打印一个对象时会调用这个对象的__repr__或__str__方法如果两个方法都写了则调用__str__方法 调用repr()方法会调用对象的__repr__方法
class Person(object):def __init__(self,name,age):#在创建对象时会自动调用这个方法print(__init__方法被调用了)self.namenameself.ageagedef __del__(self):#当对象被销毁时会自动调用这个方法print(__del__方法被调用了)def __repr__(self):return reprself.name self.agedef __str__(self):return strself.name self.age
pPerson(张三,18)
print(p)
print(repr(p))
print(p.__repr__)结果 __init__方法被调用了 __del__方法被调用了 str张三 18 repr张三 18 bound method Person.__repr__ of repr张三 18 运算符的相关魔法方法:
__eq__方法
会调用对象的_eq_方法获取这个方法的比较结果 __eq___如果不重写默认比较依然是内存地址
class Person(object):def __init__(self,name,age):#在创建对象时会自动调用这个方法self.namenameself.ageagedef __eq__(self,other):return self.nameother.name and self.ageother.age
p1Person(张三,18)
p2Person(张三,18)
# p1和p2是同一个对象吗?
#怎样比较两个对象是否是同一个对象?比较的是内存地址
# is身份运算符可以用来判断两个对象是否是同一个对象
print(p1 is p2)# False
#is 比较两个对象的内存地址
# 会调用对象的_eq_方法获取这个方法的比较结果
nums1 [1,2,3]
nums2 [1,2,3]
print(nums1 is nums2)# False
print(nums1 nums2)#True
#p1p2本质是p1.eq(p2)获取这个方法的返回值
print(p1p2)#true,因为在Person类中已经写了__eq__方法结果 False False True True __ne__方法 本质是调用__ne__方法或者__eq__方法取反 __gt__方法 本质调用_ne__方法 __ge__方法 本质调用__ge__方法 … __add__方法 默认调用此方法 __sub__方法 -默认调用此方法 … __str__方法 将对象转换为字符串时会调用此方法 打印对象时也会调用默认是类型内存地址 类属性和对象属性
简单理解类属性是整个类共有的属性对象属性是每个对象实例的属性类属性的值每个对象都一样而对象属性的值每个对象各不相同。
class Person(object):type人类def __init__(self,name,age):#在创建对象时会自动调用这个方法self.namenameself.ageage
#每个实例之间的属性没有关联互不影响
p1Person(张三,18)
p2Person(李四,18)
#可以通过实例对象来获取类属性
print(p1.type)
print(p2.type)p1.typehuman
print(p1.type) #并不会修改类属性而是给实例对象增加了一个属性#类属性只能通过类对象来修改实例对象无法修改类属性
Person.typemonkey# 修改了类属性print(p2.type)
print(Person.type)结果 人类 人类 human monkey monkey 私有属性和方法
不能够通过对象.属性方法的形式直接调用会报错以两个下划线开始的变量或方法为私有的
获取私有属性的方法
1.使用 对象._类名__私有变量名获取(也适用于私有方法)2.定义get和set方法来获取3.使用property来获取 私有方法可以在类中的其他方法中调用 def __demo(self):#__开头的方法为私有方法在外部不能直接调用print(我是私有方法)def test(self):self.__demo()静态方法和类方法
静态方法和类方法均可通过实例和类调用
class Person(object):typerichdef __init__(self,name,age):self.namenameself.ageage#如果一个方法里没有用到对象属性和类属性则可定义为静态方法staticmethoddef demo():print(hello)#类方法有一个参数cls无需手动传参指的是类对象当前类中 cls is Personclassmethoddef test(cls):#print(cls.type)
pPerson(张三,18)
#静态方法和类方法均可以通过实例对象和类对象调用
p.demo()
Person.demo()
p.test()
Person.test()结果 hello hello rich rich 单例模式
简单理解为一个类从始至终只有一个实例对象
class Singleton:__instanceNone__is_firstTrueclassmethoddef __new__(cls,*args,**kwargs):if cls.__instance is None:cls.__instanceobject.__new__(cls)return cls.__instancedef __init__(self,a,b):if self.__is_first:self.aaself.bbself.__is_firstFalse
s1Singleton(哈哈,嘿嘿嘿)
s2Singleton(呵呵,嘻嘻嘻)
print(s1.a)
print(s2.a)结果 哈哈 哈哈 二、封装Encapsulation
封装是面向对象编程的核心思想之一它将对象的属性和方法封装成一个整体隐藏对象的内部实现细节只提供有限的对外接口。在Python中虽然可以直接访问对象的属性但通常建议通过方法如getter和setter来访问和修改属性以维护封装性。
class Dog: def __init__(self, name, age): self._name name # 使用单下划线表示受保护的属性习惯用法Python不强制 self._age age def get_name(self): return self._name def set_name(self, name): self._name name # ... 其他方法
三、继承Inheritance
继承允许我们定义一个类子类来继承另一个类父类的属性和方法。子类可以拥有父类的所有属性和方法并且还可以定义自己的属性和方法。
class Animal: def __init__(self, name): self.name name def speak(self): raise NotImplementedError(Subclass must implement abstract method) class Dog(Animal): def __init__(self, name, age): super().__init__(name) # 调用父类的__init__方法 self.age age def speak(self): return f{self.name} says Woof! # 使用
d Dog(Rex, 4)
print(d.speak()) # 输出: Rex says Woof!
在这个例子中Dog类继承了Animal类并实现了speak方法。
多继承举例 若一个子类继承了多个父类 例class A(B,C),即A类同时继承了B、C两个父类则调用子类的某个方法时先在A类里面找若A类没有则会去B类方法里面找若B类里面也没有继续找B的父类若B的祖先类里都没有则回去C里面找C里面没有去C的父类里面找…(广度搜索下深度搜索)
class Animal(object):#Animal继承自object类def __init__(self,name,age):self.namenamedef sleep(self):print(self.name正在睡觉)
class Dog(Animal,object):#Dog类继承自Animal类def bark(self):print(self.name正在叫)
dDog(小哈,3)
d.bark()
print(Dog.__mro__)
结果 小哈正在叫 (class __main__.Dog, class __main__.Animal, class object) 父类中的私有方法和私有属性
父类中的私有方法和属性不能继承 可以通过对象名._父类名__私有方法或属性名进行调用
class Animal(object):#Animal继承自object类def __init__(self,name,age):self.namenameself.__ageagedef __sleep(self):print(self.name正在睡觉)
class Dog(Animal):#Dog类继承自Animal类def bark(self):print(self.name正在叫)
dDog(小哈 ,3)
print(d._Animal__age)
d._Animal__sleep()结果 3 小哈 正在睡觉 四、多态Polymorphism
多态允许不同类的对象对同一消息作出响应。在Python中多态是隐式实现的因为Python是动态类型语言。你可以定义一个接受任意类型对象作为参数的函数并在这个函数中调用这些对象的方法而不需要关心它们的具体类型。
def make_it_speak(animal): return animal.speak() # 假设还有其他类如Cat也实现了speak方法
class Cat(Animal): def speak(self): return f{self.name} says Meow! c Cat(Whiskers)
print(make_it_speak(c)) # 输出: Whiskers says Meow!
在这个例子中make_it_speak函数可以接受任何具有speak方法的对象作为参数并调用该方法。
五、总结
面向对象编程为Python开发者提供了一种强大而灵活的方式来构建和维护复杂的软件系统。通过类、对象、封装、继承和多态等核心概念开发者能够创建出高度模块化和可重用的代码从而提高开发效率和软件质量。希望本文能够帮助到大家更好地理解和应用Python的面向对象编程。 本文灵感来自原文链接https://blog.csdn.net/m0_46213598/article/details/119256595