1.面向对象与面向过程
面向对象:面向对象是以对象为基础,将数据和操作数据的方法封装在一起。每个对象都有自己的属性和行为,通过对象之间的交互来实现相应的功能。
面向过程:面向过程编程是一种以过程为中心的编程方法。在面向过程编程中,程序被分解为一系列的步骤,每个步骤都是一个函数或过程。数据和函数是分离的,数据通过参数传递给函数进行处理。程序的执行流程是线性的,从头到尾依次执行各个步骤。
面向对象提供了高层次的抽象和封装,使得代码更易于理解、修改和扩展,提高了开发效率和可维护性。而面向过程编程更依赖于详细的步骤和过程的描述,代码可读性可能较低。
面向对象的核心概念:类、对象、封装、继承、多态。
2.类和对象
类是对象的模板,它定义了对象的属性和行为。而对象是类的实例,它具有类定义的属性和行为。
# 类和对象: 类是创建对象的蓝图或模板。对象是类的实例,代表具有属性(属性)和行为(方法)的现实世界实体。
# 类:class声明一个类
# class 类名:
# pass
# 类名命名规则:大驼峰(每个单词首字母大写) MyName MyFirstName
# 实例(对象)
class Person:
pass
# 类默认返回一个实例,不用return
# p0是类Person的一个实例
p0 = Person()
# p1是类Person的一个实例
p1 = Person()
# p2是类Person的一个实例
p2 = Person()
3.初始化方法
在Python中,类的初始化方法是一个特殊的方法,称为构造函数(Constructor)。构造函数的主要作用是在实例化对象时进行对象的初始化操作。
在类中定义构造函数需要使用__init__方法(注意:init左右两边都是两个下划线)。它是一个特殊的方法,以双下划线开头和结尾。构造函数可以接受参数,用于初始化对象的属性。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 实例化一个Person对象,并传入参数进行初始化
person1 = Person("小明", 21)
# 打印对象的属性
print(person1.name) # 输出: 小明
print(person1.age) # 输出: 21
构造函数不是必须的,如果你没有定义构造函数,Python会提供一个默认的构造函数。但是如果需要在实例化对象时进行一些初始化操作,就需要定义自己的构造函数。
通过使用构造函数,可以在实例化对象时初始化对象的属性,使其具备特定的初始状态。这有助于更好地组织和管理类的对象。
class Person:
# 初始化函数
# 可以设置形参,在实例中传入实参
def __init__(self, name, age):
# print("hello")
# 指定self,初始化name为hahaha
# self.name = "hahaha"
# 实例化函数不需要返回值,自动返回的是self
print(id(self))
self.name = name
self.age = age
def display(self):
# 初始化函数不需要返回值,而普通函数需要返回值
return f"{self.name} {self.age}"
# p1是实例
p1 = Person("李毅", 19)
# self的id和p1的id一样,证明self就是p1
print(id(p1))
# 打印出实例化对象的名字年龄
print(p1.name, p1.age)
# 初始化的self中的name,将结果赋给p1
print(p1.name)
# 可调用的是类和函数
print(callable(Person), callable(lambda e: e))
# 判断类中里是否有"name"这个属性
print(hasattr(p1, "name"))
print(p1.display())
4.魔法方法
Python中,有一些方法被称为魔法方法,它们都以双下划线开头和结尾,如__init__就是一个魔法方法,在特定情况下会自动被调用,赋予了类和对象一些特殊的行为,从而更方便的实现我们想要的结果。
常用的魔法方法还有__str__,它定义对象的字符串表示形式,当使用print函数打印对象时调用。
5.self
self是一个特殊的参数,用于表示对象本身。在方法内部使用self可以访问对象的属性和调用其他方法。
6.继承
继承是一种机制,允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重用父类的代码,并根据需要添加新的功能。
class Animal:
def __init__(self, name):
self.name = name
def walk(self):
return f"{self.name} 走"
class Dog(Animal):
"""
Dog继承Animal的属性和方法
"""
def __init__(self, name, age):
Animal.__init__(self, name)
self.age = age
d1 = Dog("小花", 3)
print(d1.walk())
7.多态
多态是指同样的方法调用可以在不同的对象上产生不同的行为。它允许使用统一的接口来操作不同的对象,提高代码的灵活性和可复用性。
重载多态:重载多态就是同一个类中方法名相同但是参数不同的方法。
class Person:
# def walk(self):
# print(f"走")
def walk(self, *args):
"""
通过args可变元组参数 实现重载
"""
print(f"走", args)
p1 = Person()
p1.walk()
p1.walk(100)
p1.walk(50, 100)
p1.walk(100, 50, 90)
重写多态:重写多态就是子类继承父类的同时,将父类中的方法重写,实现特定的功能。
class SuperPerson(Person):
def skill(self):
print(f"发射技能")
def walk(self):
"""
重写父类的方法walk
子类中有walk方法,
实例在调用walk方法时直接使用的是子类中的walk方法
:return:
"""
print(f"走吧")
sp = SuperPerson()
sp.skill()
sp.walk()
8.python没有多态 python到处都是多态
处处都是多态即可以用*args来接受多个参数,参数可以为0,可以是无数个。
没有多态即类中方法名相同时实例调用会自动执行参数多的的那个方法,因此在执行后会报错,缺少参数。
9.类属性、类方法、静态方法
类属性,属于类,用类名去访问和修改
类方法,属于类,使用类名访问
静态方法 属于类 类名访问
类去访问类属性、类方法、静态方法
实例去访问实例属性和实例方法
class Person:
"""
类方法
"""
# 类属性,属于类
info = "hello world"
@classmethod
def get_doc(cls):
"""
类方法:第一个形参是cls,使用装饰器@classmethod
类去访问类属性和类方法
实例去访问实例属性和实例方法
:return:返回值是该类的类文档和该类的名字
"""
return cls.__doc__, cls.__name__
@staticmethod
def get_info():
"""
静态方法,属于类,
方法的返回值与self无关
将参数self删去,使用装饰器@staticmethod
表示该方法是静态方法
:return: 返回值与self无关
"""
return "haha"
@staticmethod
def get_f1():
"""
静态方法,与参数self无关,使用装饰器@staticmethod
类访问静态方法,实例虽然可以访问,但是不推荐
"""
return "宝剑锋从磨砺出"
def __init__(self, age):
"""
实例属性:age
self就是实例,哪个实例调用,该实例就是self
"""
self.age = age
def get_age(self):
"""
实例方法、操作
"""
return self.age
def set_age(self, age):
"""
实例方法、操作
"""
self.age = age
# 实例p1和p2,括号内就是实例属性age
p1 = Person(20)
p2 = Person(30)
# 实例p1和p2的实例方法get_age和set_age
print(p1.get_age())
print(p2.get_age())
p1.set_age(21)
p2.set_age(25)
# 使用类名.类属性,可以获取和修改类属性
print(Person.info)
print(p1.info)
# 修改类属性,类名.类属性 = ""
# 实例p1和p2都可以获取类属性,但是不能修改类属性
Person.info = "bye bye"
print(Person.info)
print(p1.info)
print(p2.info)
# 此时只是在实例属性中添加了一个属性info,恰好和类属性同名
# 并没有修改类属性
p1.info = "haha"
p2.info = "hahaha"
print(Person.info)
print(p1.info)
print(p2.info)
# 类方法
print(Person.get_doc())
# 类名访问静态方法
print(Person.get_info())
print(Person.get_f1())