青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用

青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用

  • 一、类
      • 类的定义和使用示例
  • 二、定义
      • 1. 类定义语法
      • 2. 属性和方法
      • 3. 构造器和初始化
      • 4. 实例化
      • 5. 类变量和实例变量
      • 6. 类方法和静态方法
      • 7. 继承
      • 8. 多态
      • 总结
  • 三、使用
      • 1. 创建类的实例
      • 2. 访问属性
      • 3. 调用方法
      • 4. 修改属性
      • 5. 使用类方法和静态方法
      • 6. 继承
      • 7. 多态
      • 8. 抽象类和接口
      • 9. 属性装饰器
  • 四、继承
      • 1. 继承的语法
      • 2. 调用基类的构造器
      • 3. 方法重写
      • 4. 访问基类的属性和方法
      • 5. 方法解析顺序(MRO)
      • 6. 多重继承
      • 7. 菱形继承和钻石继承
      • 8. 抽象基类(ABCs)
  • 五、多态
      • 1. 方法重写(Method Overriding)
      • 2. 鸭子类型(Duck Typing)
      • 多态的好处
      • 注意事项
  • 六、练习

课题摘要:本文详细介绍了Python中类的基本概念、定义、使用和继承。类是创建对象的蓝图,具有封装、继承、多态和抽象的特点。文章解释了如何定义类、创建实例、访问和修改属性、调用方法,并讨论了类变量、实例变量、类方法、静态方法和继承的概念。此外,还探讨了多态性,包括方法重写和鸭子类型,以及如何使用抽象基类(ABCs)来定义接口。最后,通过一个综合示例程序,展示了类的不同特性和用法,包括继承、多态、封装、方法重写、类方法、静态方法和属性装饰器。这个全面的指南为理解和应用Python中的面向对象编程提供了坚实的基础。


一、类

在Python语言中,类(Class)是一种用户定义的引用类型,它用于创建对象(Object)。类可以被看作是对象的蓝图或模板,它定义了对象的属性(变量)和方法(函数)。通过类,我们可以创建多个具有相同属性和方法的对象实例。

以下是类的一些关键特点:

  1. 封装(Encapsulation)

    • 类可以将数据(属性)和行为(方法)封装在一起,形成一个单一的单元。
    • 通过使用私有属性(以双下划线__开头)和保护属性(以单下划线_开头),类可以实现对内部状态的隐藏和访问控制。
  2. 继承(Inheritance)

    • 类可以实现继承,这意味着一个类(子类)可以继承另一个类(父类)的属性和方法。
    • 继承支持代码重用,并允许创建基于现有类的新类。
  3. 多态(Polymorphism)

    • 多态允许不同的对象对同一消息做出响应,即同一个方法调用可以有不同的行为。
    • 在Python中,多态通常是通过方法重写(子类覆盖父类的方法)和鸭子类型(duck typing)来实现的。
  4. 抽象(Abstraction)

    • 类可以提供抽象的接口,隐藏复杂的实现细节,只暴露必要的操作。
    • Python中的抽象基类(Abstract Base Classes, ABCs)允许定义不能被直接实例化的抽象类。
  5. 实例化(Instantiation)

    • 通过类定义,我们可以创建多个对象实例,每个实例都有自己的状态和行为。
  6. 构造器和析构器

    • 类可以定义特殊的方法__init__()作为构造器,用于初始化新创建的对象。
    • 类还可以定义__del__()作为析构器,用于在对象被销毁时执行清理操作。

类的定义和使用示例

class Dog:def __init__(self, name, age):  # 构造器self.name = nameself.age = agedef bark(self):  # 方法return "Woof!"def get_info(self):  # 方法return f"My name is {self.name} and I am {self.age} years old."# 创建Dog类的实例
my_dog = Dog("Buddy", 3)
print(my_dog.bark())  # 输出: Woof!
print(my_dog.get_info())  # 输出: My name is Buddy and I am 3 years old.

在这个示例中,Dog是一个类,它有两个属性(nameage)和三个方法(__init__barkget_info)。我们使用Dog类创建了一个名为my_dog的对象,并调用了它的方法。

类是Python中实现面向对象编程的核心概念,它们提供了一种强大的方式,用于组织代码、封装数据和创建可重用的对象。

二、定义

在Python中,类是面向对象编程的基本构建块,用于创建具有特定属性和行为的对象。类的定义涉及以下几个关键组成部分:

1. 类定义语法

类的定义以关键字class开始,后跟类名和一对圆括号,圆括号内可以指定父类(用于继承)。类体在缩进的块中定义。

class ClassName:# 类体pass

2. 属性和方法

  • 属性:类的属性是与类相关联的数据。它们可以是类变量(所有实例共享)或实例变量(每个实例独有)。

  • 方法:类的方法是属于类的对象,它们定义了可以对类的对象执行的操作。方法的第一个参数总是self,它代表类的实例本身。

3. 构造器和初始化

  • __init__方法是一个特殊的方法,称为类的构造器。当新对象被创建时,它会自动被调用,用于初始化新对象的状态。
class Person:def __init__(self, name, age):self.name = name  # 实例变量self.age = age

4. 实例化

使用类定义,可以创建类的实例,这些实例是具有独立状态的对象。

person = Person("Alice", 30)

5. 类变量和实例变量

  • 类变量:在类定义中直接定义的变量,由类的所有实例共享。
class Person:species = 'Homo sapiens'  # 类变量def __init__(self, name, age):self.name = name  # 实例变量self.age = age
  • 实例变量:在__init__方法中定义的变量,每个实例都有自己独立的副本。

6. 类方法和静态方法

  • 类方法:使用@classmethod装饰器定义,第一个参数是类本身(通常命名为cls)。
class Person:@classmethoddef create_new(cls, name, age):return cls(name, age)
  • 静态方法:使用@staticmethod装饰器定义,它们不接收类或实例的隐式参数。
class Person:@staticmethoddef greet(name):return f"Hello, {name}!"

7. 继承

子类可以通过继承父类的属性和方法来扩展功能。

class Employee(Person):  # 继承Person类def __init__(self, name, age, job_title):super().__init__(name, age)  # 调用父类的构造器self.job_title = job_title

8. 多态

多态允许不同的对象对同一方法调用做出响应,这在Python中通常是通过方法重写实现的。

总结

类是Python中创建对象的蓝图,它们封装了数据和行为,支持继承、封装、多态和抽象等面向对象编程的基本概念。通过定义类,我们可以创建具有特定属性和行为的对象,从而构建复杂的程序结构。

三、使用

类的使用涉及到创建类、实例化对象、调用方法、访问属性以及利用继承和多态等面向对象编程的特性。以下是类的使用的一些关键方面:

1. 创建类的实例

一旦定义了一个类,就可以创建其实例,这些实例也被称为对象。

class Car:def __init__(self, make, model):self.make = makeself.model = model# 创建Car类的实例
my_car = Car("Toyota", "Corolla")

2. 访问属性

可以通过对象访问其属性。

# 访问属性
print(my_car.make)  # 输出: Toyota
print(my_car.model)  # 输出: Corolla

3. 调用方法

可以调用对象的方法来执行某些操作。

class Car:def __init__(self, make, model):self.make = makeself.model = modeldef start_engine(self):print("Engine started.")# 调用方法
my_car.start_engine()  # 输出: Engine started.

4. 修改属性

可以修改对象的属性。

# 修改属性
my_car.model = "Camry"
print(my_car.model)  # 输出: Camry

5. 使用类方法和静态方法

类方法和静态方法是类的一部分,但它们不需要对象实例就可以调用。

class Car:color = "Red"  # 类变量@classmethoddef get_color(cls):return cls.color@staticmethoddef is_vehicle():return True# 调用类方法和静态方法
print(Car.get_color())  # 输出: Red
print(Car.is_vehicle())  # 输出: True

6. 继承

可以通过继承来创建新的类,继承可以是单继承或多继承。

class Vehicle:def __init__(self, wheels):self.wheels = wheelsclass Car(Vehicle):  # Car继承自Vehicledef __init__(self, wheels, make, model):super().__init__(wheels)self.make = makeself.model = modelmy_car = Car(4, "Toyota", "Corolla")
print(my_car.wheels)  # 输出: 4

7. 多态

多态允许子类重写父类的方法。

class Animal:def speak(self):raise NotImplementedError("Subclasses must implement this method")class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 多态的使用
animals = [Dog(), Cat()]
for animal in animals:print(animal.speak())
# 输出: Woof!
#        Meow!

8. 抽象类和接口

可以使用抽象基类(ABCs)来定义接口。

from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2# 使用抽象类
circle = Circle(5)
print(circle.area())  # 输出: 78.5

9. 属性装饰器

可以使用@property装饰器来创建只读属性或需要验证的属性。

class Car:def __init__(self, make, model):self._make = makeself._model = model@propertydef make(self):return self._make@make.setterdef make(self, value):if len(value) < 1:raise ValueError("Make must not be empty")self._make = value# 使用属性装饰器
my_car = Car("Toyota", "Corolla")
print(my_car.make)  # 输出: Toyota
my_car.make = "Honda"  # 更新make属性
print(my_car.make)  # 输出: Honda

类的使用是面向对象编程的核心,它允许我们创建灵活、可重用和模块化的代码。通过类的实例化和方法的调用,我们可以在程序中模拟现实世界的对象和行为。

四、继承

类的继承是面向对象编程中的一个核心概念,它允许我们基于一个现有的类创建一个新的类,这个过程称为派生。派生类(子类)继承了基类(父类)的属性和方法,并且可以添加新的属性和方法,或者修改继承的方法。

以下是类继承的一些关键点:

1. 继承的语法

在Python中,继承通过在类定义时在圆括号内指定基类来实现。

class BaseClass:passclass DerivedClass(BaseClass):pass

在这个例子中,DerivedClass继承了BaseClass

2. 调用基类的构造器

在派生类中,可以使用super()函数来调用基类的构造器。

class BaseClass:def __init__(self, value):self.value = valueclass DerivedClass(BaseClass):def __init__(self, value, additional_value):super().__init__(value)  # 调用基类的构造器self.additional_value = additional_value

3. 方法重写

派生类可以重写基类的方法,以提供特定的实现。

class BaseClass:def show(self):print("Base class method")class DerivedClass(BaseClass):def show(self):print("Derived class method")

4. 访问基类的属性和方法

派生类可以访问基类的公共属性和方法。

base = BaseClass()
base.value  # 访问基类的属性derived = DerivedClass(10, 20)
derived.value  # 访问继承的属性
derived.show()  # 调用重写的方法

5. 方法解析顺序(MRO)

Python使用C3线性化算法来确定方法解析顺序(Method Resolution Order,MRO),这是一种确定多个继承时方法调用顺序的算法。

class A:passclass B(A):passclass C(A):passclass D(B, C):passprint(D.mro())  # 输出D的MRO,显示方法调用的顺序

6. 多重继承

Python支持多重继承,即一个派生类可以继承多个基类。

class A:def method(self):print("Method from A")class B:def method(self):print("Method from B")class C(A, B):passc = C()
c.method()  # 根据MRO,将调用A中的方法

7. 菱形继承和钻石继承

当多个基类有共同的祖先时,会出现菱形继承或钻石继承的问题,Python通过MRO来解决这个问题。

8. 抽象基类(ABCs)

Python提供了abc模块,允许定义抽象基类,这些类不能被直接实例化,但可以强制派生类实现某些方法。

from abc import ABC, abstractmethodclass Base(ABC):@abstractmethoddef method(self):passclass Derived(Base):def method(self):print("Implemented method")

在这个例子中,Base是一个抽象基类,它要求任何派生类都必须实现method方法。

类的继承是代码重用的强大工具,它允许我们创建一个层次化的结构,使得代码更加模块化和易于维护。然而,过度使用继承或不当使用继承可能会导致代码结构复杂和难以理解,因此应该谨慎使用。

五、多态

类的多态(Polymorphism)是面向对象编程中的一个核心概念,它指的是同一个操作作用于不同的对象时,可以有不同的解释和不同的行为。多态性使得同一个方法调用可以应用于不同的对象,并且根据对象的实际类型来执行不同的代码。

在Python中,多态主要通过以下两种方式实现:

1. 方法重写(Method Overriding)

子类可以重写从父类继承来的方法,以提供特定的实现。

class Animal:def speak(self):raise NotImplementedError("Subclasses must implement this method")class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 多态的使用
def animal_sound(animal):print(animal.speak())dog = Dog()
cat = Cat()animal_sound(dog)  # 输出: Woof!
animal_sound(cat)  # 输出: Meow!

在这个例子中,Animal类定义了一个speak方法,DogCat类分别重写了这个方法。函数animal_sound接受一个Animal类型的对象,并调用其speak方法,根据传入的对象类型,输出不同的声音。

2. 鸭子类型(Duck Typing)

Python是一种动态类型语言,它采用了鸭子类型的概念,即“如果它看起来像鸭子,游起来像鸭子,那么它就是鸭子”。这意味着只要一个对象有正确的方法或属性,它就可以在需要该方法或属性的地方使用,而不管它实际上是什么类型。

class Duck:def quack(self):return "Quack!"class Person:def quack(self):return "I'm not a duck, but I quack like one!"def perform_quack(bird):print(bird.quack())duck = Duck()
person = Person()perform_quack(duck)  # 输出: Quack!
perform_quack(person)  # 输出: I'm not a duck, but I quack like one!

在这个例子中,DuckPerson类都有一个quack方法,因此都可以传递给perform_quack函数,即使Person并不是Duck的子类。

多态的好处

  • 代码的可扩展性:多态允许你添加新的类,而不需要修改使用这些类的代码。
  • 代码的可维护性:多态减少了代码的重复,使得代码更加简洁和易于维护。
  • 解耦:多态使得函数或方法不需要知道对象的具体类型,只需要知道它们有正确的接口。

注意事项

  • 多态依赖于公共接口,因此确保所有相关类都实现了必要的方法是很重要的。
  • 在Python中,由于动态类型的特性,需要小心处理类型检查和错误处理。

多态是面向对象编程中的一个重要特性,它提供了灵活性和强大的代码重用能力,使得代码更加通用和灵活。

六、练习

下面是一个示例程序,它体现了类的多个方面,包括类的继承、多态、封装、方法重写、类方法、静态方法和属性装饰器。

from abc import ABC, abstractmethod# 抽象基类,定义了一个接口
class Animal(ABC):def __init__(self, name):self.name = name@abstractmethoddef speak(self):pass# 具体类,继承自Animal并实现speak方法
class Dog(Animal):def speak(self):return f"{self.name} says: Woof!"# 另一个具体类,继承自Animal并实现speak方法
class Cat(Animal):def speak(self):return f"{self.name} says: Meow!"# 另一个抽象类,继承自Animal
class WildAnimal(Animal):@abstractmethoddef hunt(self):pass# 继承自WildAnimal的具体类
class Lion(WildAnimal):def speak(self):return f"{self.name} says: Roar!"def hunt(self):return f"{self.name} is hunting."# 包含类方法和静态方法的类
class MathTools:@classmethoddef add(cls, a, b):return a + b@staticmethoddef multiply(a, b):return a * b# 使用属性装饰器的类
class Car:def __init__(self, make, model):self._make = makeself._model = model@propertydef make(self):return self._make@make.setterdef make(self, value):if not value:raise ValueError("Make cannot be empty")self._make = value@propertydef model(self):return self._model@model.setterdef model(self, value):if not value:raise ValueError("Model cannot be empty")self._model = value# 使用这些类
def main():# 多态的体现animals = [Dog("Buddy"), Cat("Whiskers"), Lion("Leo")]for animal in animals:print(animal.speak())# 类方法和静态方法的体现print(MathTools.add(3, 4))  # 输出: 7print(MathTools.multiply(3, 4))  # 输出: 12# 属性装饰器的体现my_car = Car("Toyota", "Corolla")print(f"{my_car.make} {my_car.model}")  # 输出: Toyota Corollamy_car.make = "Honda"  # 使用属性装饰器设置值print(f"{my_car.make} {my_car.model}")  # 输出: Honda Corollaif __name__ == "__main__":main()

这个程序包含了以下几个部分:

  1. 抽象基类(Animal):定义了一个名为speak的抽象方法,要求所有继承自Animal的子类都必须实现这个方法。

  2. 具体类(Dog和Cat):继承自Animal并重写了speak方法,体现了多态性。

  3. 另一个抽象类(WildAnimal):继承自Animal并定义了一个新的抽象方法hunt

  4. 继承自WildAnimal的具体类(Lion):实现了speakhunt方法。

  5. 类方法和静态方法(MathTools):展示了类方法和静态方法的使用。

  6. 属性装饰器(Car):使用@property装饰器创建了 getter 和 setter 方法,以控制对属性的访问和赋值。

这个程序展示了类的继承、多态、封装、方法重写、类方法、静态方法和属性装饰器等面向对象编程的关键概念。

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

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

相关文章

[Collection与数据结构] B树与B+树

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之修改密码和个人资料

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f383;1.修改密码 -持久…

蓝桥杯小白打卡第二天

789. 数的范围 题目描述 给定一个按照升序排列的长度为 n n n 的整数数组&#xff0c;以及 q q q 个查询。 对于每个查询&#xff0c;返回一个元素 k k k 的起始位置和终止位置&#xff08;位置从 0 0 0 开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返…

Vue WebSocket简单应用 ws

webSocket应用 <template><div></div> </template><script> import { getToken } from "/utils/auth"; export default {data() {return {url: "",Socket: null, //socket对象lockReconnect: false, //锁定拒绝重连close: …

【Elasticsearch】terms聚合误差问题

Elasticsearch中的聚合查询在某些情况下确实可能存在误差&#xff0c;尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面&#xff1a; 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片&#xff0c;每个分片独立地计算聚合结果。由于数据在分…

电脑可以自己换显卡吗?怎么操作

电脑是否可以自己换显卡主要取决于电脑的类型&#xff08;台式机或笔记本&#xff09;以及电脑的硬件配置。以下是对这一问题的详细解答及操作步骤&#xff1a; 一、判断电脑是否支持更换显卡 台式机&#xff1a;大多数台式电脑都支持更换显卡。只要主板上有PCIe插槽&#xff…

element-plus+vue3前端如何根据name进行搜索查到符合条件的数据

界面如图&#xff0c;下面的区域是接口给的所有的&#xff0c;希望前端根据输入的内容自己去匹配。 我是使用的element-plusvue3ts的写法。 <el-input v-model"filters.region" placeholder"输入区域搜索" keyup"filterRegion(filters.region)&q…

从离散傅里叶变换(DFT)到快速傅里叶变换(FFT)

摘要 离散傅里叶变换&#xff08;DFT&#xff09;是数字信号处理领域中分析信号频域特性的重要工具&#xff0c;但直接计算DFT的复杂度较高&#xff0c;限制了其在大规模数据处理中的应用。快速傅里叶变换&#xff08;FFT&#xff09;的出现显著降低了计算复杂度&#xff0c;极…

Oracle常用响应文件介绍(19c)

文章目录 1. 数据库安装响应文件1.1 响应文件模板1.2 参数说明1.2.1 响应文件版本参数1.2.2 安装选项参数1.2.3 Unix 用户组参数1.2.4 软件清单参数1.2.5 安装目录参数1.2.6 安装版本参数1.2.7 特权操作权限组指定参数1.2.8 Root脚本执行配置参数1.2.9 Grid选项配置参数1.2.10 …

【3分钟极速部署】在本地快速部署deepseek

第一步&#xff0c;找到网站&#xff0c;下载&#xff1a; 首先找到Ollama &#xff0c; 根据自己的电脑下载对应的版本 。 我个人用的是Windows 我就先尝试用Windows版本了 &#xff0c;文件不是很大&#xff0c;下载也比较的快 第二部就是安装了 &#xff1a; 安装完成后提示…

基于Typescript,使用Vite构建融合Vue.js的Babylon.js开发环境

一、创建Vite项目 使用Vite初始化一个VueTypeScript项目&#xff1a; npm create vitelatest my-babylon-app -- --template vue-ts cd my-babylon-app npm create vitelatest my-babylon-app -- --template vue-ts 命令用于快速创建一个基于 Vite 的 Vue TypeScript 项目。…

Zookeeper入门部署(单点与集群)

本篇文章基于docker方式部署zookeeper集群&#xff0c;请先安装docker 目录 1. docker初期准备 2.启动zookeeper 2.1 单点部署 2.2 集群部署 3. Linux脚本实现快速切换启动关闭 1. docker初期准备 拉取zookeeper镜像 docker pull zookeeper:3.5.6 如果拉取时间过长&#xf…

QMK启用摇杆和鼠标按键功能

虽然选择了触摸屏&#xff0c;我仍选择为机械键盘嵌入摇杆模块&#xff0c;这本质上是对"操作连续性"的执着。   值得深思的是&#xff0c;本次开发过程中借助DeepSeek的代码生成与逻辑推理&#xff0c;其展现的能力已然颠覆传统编程范式&#xff0c;需求描述可自动…

Qt的QTableWidget类的声明定义和使用

QTableWidget类的声明定义 QTableWidget 是 Qt 框架中的一个类&#xff0c;它继承自 QAbstractItemView 并提供了用于显示和操作二维表格数据的接口。这个类不是由用户直接声明的&#xff0c;而是由 Qt 库提供的。你可以在你的 Qt 应用程序中通过包含相应的头文件来使用它。 …

Linux里的容器被OOM killed的两种情况

生产上遇到过几次容器实例被OOM的现象&#xff0c;总结一下LInux OOM的两种触发条件。我的虚拟机是ubuntu 24.0.4版本&#xff0c;分配4G内存&#xff0c;在我的虚拟机上复现这两种case。 一 宿主机物理内存不够 当linux上所有应用程序的内存需求加起来超出了物理内存&#x…

使用Express.js和SQLite3构建简单TODO应用的后端API

使用Express.js和SQLite3构建简单TODO应用的后端API 引言环境准备代码解析1. 导入必要的模块2. 创建Express应用实例3. 设置数据库连接4. 初始化数据库表5. 配置中间件6. 定义数据接口7. 定义路由7.1 获取所有TODO项7.2 创建TODO项7.3 更新TODO项7.4 删除TODO项 8. 启动服务器 …

Windows本地部署DeepSeek-R1大模型并使用web界面远程交互

文章目录 前言1. 安装Ollama2. 安装DeepSeek-r1模型3. 安装图形化界面3.1 Windows系统安装Docker3.2 Docker部署Open WebUI3.3 添加Deepseek模型 4. 安装内网穿透工具5. 配置固定公网地址 前言 最近爆火的国产AI大模型Deepseek详细大家都不陌生&#xff0c;不过除了在手机上安…

低代码开发与传统开发:未来的技术路线选择

在科技飞速发展的当下&#xff0c;软件开发技术日新月异&#xff0c;低代码开发与传统开发作为两种重要的开发模式&#xff0c;正站在未来技术路线选择的十字路口&#xff0c;引发了众多企业和开发者的关注。它们各自有着独特的优势和适用场景&#xff0c;究竟该如何抉择&#…

二、0-1搭建springboot+vue3前后端分离-登录页面

项目仓库地址&#xff1a;zgw-admin: 从0-1搭建一个springbootvue3的项目&#xff0c;这是源码 本次主要是为了&#xff1a; a.写登录页面 b.element plus组件是否能正常使用 c.页面调用ts是否正常&#xff0c;无参和有参的函数 首页的图片&#xff1a; 页面效果 1、引入…

《翻转组件库之发布》

背景 继《翻转组件库之打包》_杨晓风-linda的博客-CSDN博客之后&#xff0c;组件库已经可以正常构建&#xff0c;那如何像elementUI等组件库那样&#xff0c;用npm安装&#xff0c;按照既定的用法使用即可呢&#xff1f;本篇便为你揭晓 资料相关 1、npm官方文档&#xff1a;…