Python-VBA函数之旅-issubclass函数

目录

一、issubclass函数的常见应用场景:

二、issubclass函数使用注意事项:

三、如何用好issubclass函数?

1、issubclass函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:神奇夜光杯-CSDN博客 



一、issubclass函数的常见应用场景:

        issubclass函数在Python编程中有多种实际应用场景,它主要用于在运行时检查类的继承关系,常见的应用场景有:

1、类型检查:在编写可重用和灵活的代码时,你可能需要编写能够处理多种类型的函数或方法;使用issubclass()函数,你可以检查传入的参数类型是否是期望类型的子类,从而根据类型执行不同的操作。

2、设计模式:在实现某些设计模式,如工厂模式或策略模式时,issubclass()函数可以帮助确定对象的具体类型,从而决定如何执行某些操作。

3、异常处理:在处理异常时,issubclass()函数可以用来检查捕获的异常是否是某个特定异常类的实例,这可以用来实现更加精细的错误处理逻辑。

4、反射:在编写需要动态检查类关系的代码时,如在编写测试框架或元编程工具时,issubclass()函数可以帮助你确定类之间的继承关系。

5、文档生成:当生成类或模块的文档时,你可能想要列出所有的子类,以便提供完整的类层次结构信息。

6、框架和库开发:在构建框架或库时,你可能会提供一个基类或接口,要求用户实现特定的方法;使用issubclass()函数,你可以确保用户提供的类确实实现了你期望的接口。

7、测试和调试:在编写单元测试和调试代码时,issubclass()函数可以用来验证类的结构是否符合预期,帮助开发者发现和修复问题。

8、元类编程:在更高级的编程场景中,如元编程,issubclass()函数可以用于在运行时构建和修改类的行为。

        总之,issubclass()函数在Python编程中提供了强大的类型检查能力,特别是在面向对象编程和构建可扩展系统的场景中非常有用。

二、issubclass函数使用注意事项:

        在Python中使用issubclass()函数时,需牢记以下几点:

1、参数类型:issubclass()函数的第一个参数必须是一个类对象,第二个参数可以是一个类对象或者是一个包含类对象的元组;如果传入非类对象作为第一个参数,将会引发TypeError异常。

2、元组参数:当第二个参数是元组时,元组应该只包含类对象;如果元组中包含非类对象,同样会抛出TypeError错误。

3、继承关系:issubclass()函数检查的是直接的或间接的继承关系;如果一个类是另一个类的子类(直接或间接),issubclass()函数将返回True。注意,一个类总是其自身的子类,所以issubclass(A, A)将返回True。

4、切勿过度使用:尽管issubclass()函数在某些场景下非常有用,但过度使用它可能会使代码变得复杂和难以维护;Python是一种动态类型的语言,通常更推荐使用鸭子类型(duck typing)而不是显式地检查类型。

5、接口检查:如果你需要检查一个类是否实现了特定的接口(即,是否包含特定的方法),使用hasattr()函数或dir()函数来检查方法的存在可能更合适;issubclass()函数仅检查继承关系,不检查类是否实现了特定的方法。

6、性能考虑:虽然issubclass()函数的性能通常是可接受的,但在性能敏感的代码中,如果你需要频繁地检查类的继承关系,可能需要考虑其他优化手段,比如缓存结果或使用其他数据结构来跟踪类的关系。

        总之,记住这些注意事项,可以帮助你更有效地使用issubclass()函数,并避免常见的错误和性能问题。

三、如何用好issubclass函数?

        在Python中,issubclass()函数是一个强大的工具,用于在运行时检查一个类是否是另一个类的子类,相关学习建议如下:

1、明确检查目的:在使用issubclass()函数之前,首先要明确你为何需要检查类的继承关系?是为了确保某个对象符合特定的接口?还是为了根据类型执行不同的逻辑?明确目的有助于你更准确地使用这个函数。

2、检验参数:确保你传递给issubclass()函数的参数是正确的,第一个参数应该是你想要检查的类,而第二个参数则是你期望的基类或基类的元组;如果参数不正确,你会遇到TypeError异常。

3、验查接口:虽然issubclass()是基于类的继承关系来工作的,但在Python中,更常见的做法是使用鸭子类型(duck typing),这意味着你通常应该基于对象的行为(即它们实现了哪些方法)而不是它们的类型来编写代码;只有在确实需要基于继承关系进行类型检查时,才使用issubclass()函数。

4、避免过度使用:过度使用issubclass()函数或其他类型检查机制可能导致代码变得复杂且难以维护;尝试设计你的代码以使其更加灵活和通用,而不是依赖于特定的类继承关系。

5、结合其他工具:issubclass()函数通常与其他Python特性一起使用,如抽象基类(ABCs)、元编程和动态类型检查,你可以结合这些工具来构建更强大和灵活的代码库。

6、错误消息集锦:如果你在代码中使用了issubclass()来执行类型检查,并在检查失败时抛出异常,确保提供清晰的错误消息,说明为什么类型检查失败以及如何解决问题。

7、单元测试代码:编写单元测试来验证你的issubclass()函数检查是否按预期工作,这有助于确保你的代码在不同的类继承关系下都能正确运行。

1、issubclass函数:
1-1、Python:
# 1.函数:issubclass
# 2.功能:用于判断类是否是另外一个类或者类型元组中任意类元素的子类
# 3.语法:issubclass(class, classinfo)
# 4.参数:
# 4-1、class:类名,用于指定子类
# 4-2、classinfo:类名,用于指定父类
# 5.返回值:如果class是classinfo的子类,就返回True;反之,则返回False
# 6.说明:在3.10版本发生变更: classinfo可以是一个union类型,即由多个父类组成的元组形式出现
# 7.示例:
# 利用dir()函数获取函数的相关内置属性和方法
print(dir(issubclass))
# ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
# '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__',
# '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__',
# '__str__', '__subclasshook__', '__text_signature__']

# 利用help()函数获取函数的文档信息
help(issubclass)

# 应用一:类型检查
# 示例1:检查类是否是另一个类的直接子类
class Base:
    pass
class Derived(Base):
    pass
def check_direct_subclass(cls, base):
    return issubclass(cls, base)  and (cls != base)
# 使用示例
print(check_direct_subclass(Derived, Base))
print(check_direct_subclass(Base, Derived))
# True
# False

# 示例2:检查类是否是某个基类的子类(包括间接子类)
class Base:
    pass
class Derived(Base):
    pass
class Grandchild(Derived):
    pass
def check_subclass(cls, base):
    return issubclass(cls, base)
# 使用示例
print(check_subclass(Derived, Base))
print(check_subclass(Grandchild, Base))
print(check_subclass(Base, Base))
# True
# True
# True

# 示例3:检查类是否属于多个基类中的任何一个
class Base1:
    pass
class Base2:
    pass
class Derived(Base1):
    pass
def check_subclass_of_any(cls, *bases):
    return any(issubclass(cls, base) for base in bases)
# 使用示例
print(check_subclass_of_any(Derived, Base1, Base2))
print(check_subclass_of_any(Base2, Base1, Base2))
print(check_subclass_of_any(Base1, Base2))
# True
# True
# False

# 示例4:检查类是否不是任何指定基类的子类
class Base1:
    pass
class Base2:
    pass
class Independent:
    pass
def check_not_subclass_of(cls, *bases):
    return not any(issubclass(cls, base) for base in bases)
# 使用示例
print(check_not_subclass_of(Independent, Base1, Base2))
print(check_not_subclass_of(Base1, Base2))
print(check_not_subclass_of(Base2, Base1, Base2))
# True
# True
# False

# 应用二:设计模式
# 示例1:工厂模式
class Car:
    pass
class ElectricCar(Car):
    pass
class PetrolCar(Car):
    pass
def car_factory(car_class):
    if issubclass(car_class, Car):
        return car_class()
    else:
        raise ValueError("Invalid car class")
# 使用示例
electric_car = car_factory(ElectricCar)
petrol_car = car_factory(PetrolCar)
# 尝试创建无效类型的汽车(将引发异常)
# invalid_car = car_factory(str)

# 示例2:策略模式
class SortingStrategy:
    pass
class BubbleSort(SortingStrategy):
    def sort(self, data):
        # Bubble sort implementation
        pass
class QuickSort(SortingStrategy):
    def sort(self, data):
        # Quick sort implementation
        pass
def sort_data(data, strategy_class):
    if issubclass(strategy_class, SortingStrategy):
        strategy = strategy_class()
        strategy.sort(data)
    else:
        raise ValueError("Invalid sorting strategy")
# 使用示例
data = [3, 6, 5, 8, 11, 10, 24, 10]
sort_data(data, BubbleSort)  # 使用冒泡排序
sort_data(data, QuickSort)  # 使用快速排序

# 示例3:访问者模式
class Element:
    def accept(self, visitor):
        pass
class ConcreteElementA(Element):
    def accept(self, visitor):
        return visitor.visit_concrete_element_a(self)
class ConcreteElementB(Element):
    def accept(self, visitor):
        return visitor.visit_concrete_element_b(self)
class Visitor:
    pass
class ConcreteVisitorA(Visitor):
    def visit_concrete_element_a(self, element):
        print(f"Visiting ConcreteElementA: {element}")
    def visit_concrete_element_b(self, element):
        print(f"Visiting ConcreteElementB: {element}")
def visit_elements(elements, visitor_class):
    if issubclass(visitor_class, Visitor):
        visitor = visitor_class()
        for element in elements:
            element.accept(visitor)
    else:
        raise ValueError("Invalid visitor class")
# 使用示例
elements = [ConcreteElementA(), ConcreteElementB()]
visit_elements(elements, ConcreteVisitorA)
# Visiting ConcreteElementA: <__main__.ConcreteElementA object at 0x000002A5F8FDEB50>
# Visiting ConcreteElementB: <__main__.ConcreteElementB object at 0x000002A5F8FDEB90>

# 应用三:异常处理
# 示例1:检查异常类型
class MyCustomException(Exception):
    pass
class MySpecificException(MyCustomException):
    pass
def handle_exception(exc):
    if issubclass(type(exc), MyCustomException):
        print("Handling a custom exception")
    else:
        print("Handling a generic exception")
try:
    raise MySpecificException("This is a specific exception")
except Exception as e:
    handle_exception(e)
try:
    raise ValueError("This is a built-in exception")
except Exception as e:
    handle_exception(e)
# Handling a custom exception
# Handling a generic exception

# 示例2:多个异常类型检查
class MyCustomException1(Exception):
    pass
class MyCustomException2(Exception):
    pass
def handle_specific_exceptions(exc):
    if issubclass(type(exc), (MyCustomException1, MyCustomException2)):
        print("Handling a specific custom exception")
    else:
        print("Handling a generic exception")
try:
    raise MyCustomException1("This is a custom exception 1")
except Exception as e:
    handle_specific_exceptions(e)
try:
    raise ValueError("This is a built-in exception")
except Exception as e:
    handle_specific_exceptions(e)
# Handling a specific custom exception
# Handling a generic exception

# 示例3:异常链(Python 3中引入)
class MyCustomException(Exception):
    pass
class AnotherCustomException(Exception):
    pass
def handle_exception(exc):
    # 检查是否是自定义异常
    if issubclass(type(exc), MyCustomException):
        print("Handling a custom exception of type:", type(exc).__name__)
        # 检查是否有原始异常,并处理它
        if exc.__cause__ is not None:
            print("Original exception:", type(exc.__cause__).__name__)
            # 可以递归调用handle_exception来处理原始异常
            # handle_exception(exc.__cause__)
    else:
        print("Handling a generic exception")
try:
    try:
        # 假设这里引发了一个内置异常
        raise ValueError("Invalid value")
    except ValueError as e:
        # 在这里,我们引发一个自定义异常,并链接到原始异常
        raise MyCustomException("A problem occurred") from e
except MyCustomException as mce:
    # 处理自定义异常
    handle_exception(mce)
try:
    # 直接引发一个自定义异常,没有原始异常
    raise AnotherCustomException("Another problem occurred")
except Exception as e:
    # 处理所有其他异常
    handle_exception(e)
# Handling a custom exception of type: MyCustomException
# Original exception: ValueError
# Handling a generic exception

# 应用四:反射
# 示例1:检查类继承关系
class BaseClass:
    pass
class DerivedClass(BaseClass):
    pass
def check_inheritance(cls, base_cls):
    return issubclass(cls, base_cls)
# 使用示例
print(check_inheritance(DerivedClass, BaseClass))
print(check_inheritance(BaseClass, DerivedClass))
# True
# False

# 示例2:使用globals()或locals()进行反射
class MyClass:
    pass
def reflect_on_classes():
    # 获取当前作用域内的所有变量
    all_vars = globals()
    # 查找并打印所有MyClass的子类
    for name, obj in all_vars.items():
        if isinstance(obj, type) and issubclass(obj, MyClass) and obj is not MyClass:
            print(f"{name} is a subclass of MyClass")
# 定义MyClass的子类
class SubClass1(MyClass):
    pass
class SubClass2(MyClass):
    pass
# 执行反射函数
reflect_on_classes()
# SubClass1 is a subclass of MyClass
# SubClass2 is a subclass of MyClass

# 示例3:动态加载模块并检查类关系
import importlib
def check_class_in_module(module_name, class_name, base_class):
    # 动态加载模块
    module = importlib.import_module(module_name)
    # 获取类对象
    cls = getattr(module, class_name, None)
    # 检查类是否存在并且是base_class的子类
    if cls is not None and issubclass(cls, base_class):
        print(f"{class_name} in {module_name} is a subclass of {base_class.__name__}")
    else:
        print(f"No {class_name} found in {module_name} or it is not a subclass of {base_class.__name__}")
# 使用示例
check_class_in_module('collections', 'abc.Container', object)
# No abc.Container found in collections or it is not a subclass of object

# 应用五:文档生成
class Animal:
    pass
class Animal:
    pass
class Mammal(Animal):
    pass
class Reptile(Animal):
    pass
class Dog(Mammal):
    pass
class Snake(Reptile):
    pass
import inspect
def generate_class_hierarchy_docs(base_class, module=None):
    """
    Generate a documentation string for the class hierarchy starting from the given base class.
    :param base_class: The base class to start generating the hierarchy for.
    :param module: The module to search for classes (defaults to the current module).
    :return: None (prints the hierarchy to the console).
    """
    if module is None:
        module = inspect.getmodule(base_class)
    print(f"Class Hierarchy for {base_class.__name__}:")
    print("-" * len(base_class.__name__) + "-")
    for name, cls in inspect.getmembers(module, inspect.isclass):
        if issubclass(cls, base_class) and cls is not base_class:
            def print_inheritance_chain(cls, indent=""):
                print(f"{indent}{cls.__name__}")
                for base in cls.__bases__:
                    if issubclass(base, Animal):  # Only print Animal subclasses in the chain
                        print_inheritance_chain(base, indent + "  ")
            print_inheritance_chain(cls)
            print()  # Separate different subclasses with a newline
# 生成Animal类的继承关系文档
generate_class_hierarchy_docs(Animal)
# Class Hierarchy for Animal:
# -------
# Dog
#   Mammal
#     Animal
#
# Mammal
#   Animal
#
# Reptile
#   Animal
#
# Snake
#   Reptile
#     Animal

# 应用六:框架和库开发
# 示例1:确保用户提供的类继承自特定的基类
class Shape:
    pass
def register_shape_class(cls):
    if not issubclass(cls, Shape):
        raise ValueError(f"{cls.__name__} does not inherit from Shape")
        # 注册类到图形库中的代码...
    print(f"Registered {cls.__name__} as a shape class.")
# 用户提供的类
class Circle(Shape):
    pass
class Triangle:
    pass
# 注册Circle类,这是合法的
register_shape_class(Circle)  # 输出: Registered Circle as a shape class.
# 尝试注册Triangle类,这将引发错误
try:
    register_shape_class(Triangle)
except ValueError as e:
    print(e)  # 输出: Triangle does not inherit from Shape
# Registered Circle as a shape class.
# Triangle does not inherit from Shape

# 示例2:检查接口兼容性
class DataProcessor:
    @staticmethod
    def process_data(data):
        raise NotImplementedError("Subclasses must implement this method")
def is_data_processor(cls):
    return (
            issubclass(cls, DataProcessor) and
            callable(getattr(cls, "process_data", None))
    )
class MyDataProcessor(DataProcessor):
    @staticmethod
    def process_data(data):
        return data * 2
class AnotherClass:
    pass
# 检查MyDataProcessor是否实现了DataProcessor接口
print(is_data_processor(MyDataProcessor))
# 检查AnotherClass是否实现了DataProcessor接口
print(is_data_processor(AnotherClass))
# True
# False

# 示例3:在框架中使用插件系统
class PluginBase:
    def initialize(self):
        pass
    def execute(self, data):
        pass
def load_plugin(plugin_cls):
    if not issubclass(plugin_cls, PluginBase):
        raise TypeError(f"{plugin_cls.__name__} is not a valid plugin class")
        # 加载插件的代码...
    plugin_instance = plugin_cls()
    plugin_instance.initialize()
    return plugin_instance
# 用户提供的插件类
class MyPlugin(PluginBase):
    def initialize(self):
        print("Initializing MyPlugin")

    def execute(self, data):
        print(f"Executing with data: {data}")
# 加载并初始化插件
plugin = load_plugin(MyPlugin)
plugin.execute("Some data")
# Initializing MyPlugin
# Executing with data: Some data

# 应用七:测试和调试
# 示例1:基本继承关系测试
class Base:
    pass
class Derived(Base):
    pass
class AnotherDerived(Base):
    pass
# 测试继承关系
assert issubclass(Derived, Base), "Derived should be a subclass of Base"
assert issubclass(AnotherDerived, Base), "AnotherDerived should be a subclass of Base"
assert not issubclass(Base, Derived), "Base should not be a subclass of Derived"
print("Inheritance tests passed")
# Inheritance tests passed

# 示例2:测试多重继承
class A:
    pass
class B:
    pass
class C(A, B):
    pass
# 测试多重继承
assert issubclass(C, A), "C should be a subclass of A"
assert issubclass(C, B), "C should be a subclass of B"
print("Multiple inheritance tests passed")
# Multiple inheritance tests passed

# 示例3:使用isinstance与issubclass结合进行调试
class MyClass:
    pass
obj = MyClass()
# 使用isinstance检查实例关系
assert isinstance(obj, MyClass), "obj should be an instance of MyClass"
# 使用issubclass检查子类关系(这里只是为了展示,通常不这么用)
assert issubclass(MyClass, object), "MyClass should be a subclass of object"
print("Instance and subclass checks passed")
# Instance and subclass checks passed

# 示例4:使用unittest模块进行单元测试
import unittest
class TestInheritance(unittest.TestCase):
    def test_basic_inheritance(self):
        class Base:
            pass
        class Derived(Base):
            pass
        self.assertTrue(issubclass(Derived, Base), "Derived should be a subclass of Base")
    def test_multiple_inheritance(self):
        class A:
            pass
        class B:
            pass
        class C(A, B):
            pass
        self.assertTrue(issubclass(C, A), "C should be a subclass of A")
        self.assertTrue(issubclass(C, B), "C should be a subclass of B")
    def test_not_subclass(self):
        class A:
            pass

        class B:
            pass
        self.assertFalse(issubclass(A, B), "A should not be a subclass of B")
if __name__ == '__main__':
    unittest.main()
# E:\python_workspace\pythonProject\.venv\Scripts\python.exe "E:/Program Files/JetBrains/PyCharm Community Edition 2023.3/plugins/python-ce/helpers/pycharm/_jb_unittest_runner.py" --path E:\python_workspace\pythonProject\test2.py
# Testing started at 21:10 ...
# Launching unittests with arguments python -m unittest E:\python_workspace\pythonProject\test2.py in E:\python_workspace\pythonProject
#
#
#
# Ran 3 tests in 0.004s
#
# OK

# 应用八:元类编程
# 示例1:定义一个简单的元类,并检查继承关系
class Meta(type):
    def __init__(cls, name, bases, dct):
        super().__init__(name, bases, dct)
        print(f"Creating class {name}")
        # 检查继承关系
        for base in bases:
            if issubclass(base, object):
                print(f"{name} inherits from {base.__name__}")
class MyClass(metaclass=Meta):
    pass
class MyOtherClass(MyClass):
    pass
# 输出将显示类的创建和继承关系
# Creating class MyClass
# Creating class MyOtherClass
# MyOtherClass inherits from MyClass

# 示例2:使用元类自动注册子类
class RegistryMeta(type):
    _registry = {}
    def __init__(cls, name, bases, dct):
        super().__init__(name, bases, dct)
        # 如果是直接继承自基类(不是继承自其他派生类),则注册
        if not any(issubclass(b, cls) for b in cls.__bases__):
            RegistryMeta._registry[name] = cls
    @classmethod
    def get_subclass(cls, name):
        return cls._registry.get(name)
class BaseClass(metaclass=RegistryMeta):
    pass
class SubClass1(BaseClass):
    pass
class SubClass2(BaseClass):
    pass
# 检查并获取子类
subclass1 = RegistryMeta.get_subclass('SubClass1')
print(subclass1 is SubClass1)
# 检查继承关系
print(issubclass(SubClass1, BaseClass))
# True
# True
1-2、VBA:
略,待后补。
2、推荐阅读:

1、Python-VBA函数之旅-isinstance()函数

Python算法之旅:Algorithm

Python函数之旅:Functions 

个人主页:神奇夜光杯-CSDN博客 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spark3.0.0单机模式安装

注&#xff1a;此安装教程基于hadoop3集群版本 下载安装包 下载spark3.0.0版本&#xff0c;hadoop和spark版本要对应&#xff0c;否则会不兼容 用xftp上传Linux虚拟机&#xff0c;上传目录/bigdata&#xff08;可修改&#xff09; 解压 tar -zxvf /bigdata/spark-3.0.0-bin-h…

rust是否可以用于8051单片机开发工作?

目前&#xff0c;Rust 在嵌入式领域的发展主要集中在一些常见的架构上&#xff0c;如ARM Cortex-M&#xff08;包括STM32系列&#xff09;、RISC-V等。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c…

java的各种锁

我们先来看看有什么锁 一、java锁 1、乐观锁 乐观锁 是一种乐观思想 &#xff0c;假定当前环境是读多写少&#xff0c;遇到并发写的概率比较低&#xff0c;读数 据时认为别的线程不会正在进行修改&#xff08;所以没有上锁&#xff09;。写数据时&#xff0c;判断当前 与期望…

【3GPP】【核心网】【5G】5G核心网协议解析(四)(超详细)

1. 欢迎大家订阅和关注&#xff0c;精讲3GPP通信协议&#xff08;2G/3G/4G/5G/IMS&#xff09;知识点&#xff0c;专栏会持续更新中.....敬请期待&#xff01; 目录 1. NGAP 按流程功能分类 1.1 接口管理过程 1.1.1 NG Setup 1.2.1 NAS消息传输过程 Transport of NAS Messa…

.NET 基于Socket中转WebSocket

前言 针对IOS App Proxy Server无法直连WebSocket&#xff0c;建立 Socket中转端。 WebSocket 端&#xff1a; WebSocket 端用于实现实时通信功能。 WebSocket 端通过 WebSocket 协议与中转端通信&#xff0c;中转端可以通过 WebSocket 或其他传输协议与 WebSocket 端建立连…

【工具】录屏软件Captura安装使用及ffmpeg下载配置

开启技术视频创作&#xff0c;录屏软件林林总总&#xff0c;适合的、习惯的最好。 录屏软件Captura的使用及ffmpeg下载配置 1.Captura下载、安装2.FFmpeg下载、配置3.Captura屏幕录制试用、录制视频效果 1.Captura下载、安装 Captura主要是一个免费开源的录屏软件&#xff0c…

2024年新算法-鹦鹉优化器(PO)优化BP神经网络回归预测

2024年新算法-鹦鹉优化器(PO)优化BP神经网络回归预测 亮点&#xff1a; 输出多个评价指标&#xff1a;R2&#xff0c;RMSE&#xff0c;MSE&#xff0c;MAPE和MAE 满足需求&#xff0c;分开运行和对比的都有对应的主函数&#xff1a;main_BP, main_PO, main_BPvsBP_PO&#x…

洛谷 P1021 邮票面值设计

原题链接&#xff1a;[NOIP1999 提高组] 邮票面值设计 - 洛谷 目录 题目描述 解题思路&#xff1a; 代码实现&#xff1a; 题后总结&#xff1a; 题目描述 给定一个信封&#xff0c;最多只允许粘贴 N 张邮票&#xff0c;计算在给定 K&#xff08;NK≤15&#xff09;种邮票…

javaWeb项目-邮票鉴赏系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java技术 Java 程…

spring boot3单模块项目工程搭建-下(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编…

浅涉ROS世界中的坐标系及其他

声明&#xff1a;文中图片素材均采用了其他博主文章&#xff08;文末参考来源&#xff09;&#xff0c;如有侵权或不妥&#xff08;确有不妥和不安&#xff0c;奈何苦于佳图难觅&#xff09;&#xff0c;还望告知&#xff0c;立即删除&#xff01; 坐标系统 ROS中的…

【Stable Diffusion系列】(一):AI绘画本地部署教程

目录 一、总览 二、本地部署 1、安装cuda 2、安装python 3、安装git 4、方法一 1&#xff09;获取安装包 2&#xff09;update 3&#xff09;run 5、方法二 1&#xff09;git clone 2&#xff09;双击webui-user.bat 3&#xff09;更新 6、设置启动参数 7、…

【linux】进程地址被占用

在强制关闭一个udp程序后&#xff0c;重启该程序报错&#xff1a; bind error: Address already in use 查找并关闭占用端口的进程&#xff1a; 首先&#xff0c;确定哪个进程占用了目标端口。在Linux系统中&#xff0c;可以使用以下命令&#xff1a; netstat -tulnp | grep …

ArcGIS无法开始编辑TIN!开始编辑TIN显示灰色

ArcGIS无法开始编辑TIN&#xff01;开始编辑TIN显示灰色&#xff1f; 解决方案&#xff01; 1、确认自定义——扩展模块中空间分析、3D分析模块勾选。 2、确认以上后&#xff0c;还是不能编辑的话&#xff0c;我们可以调出 3D分析分析工具条&#xff0c;你就会发现。TIN编辑工…

Paddle 1.8 与 Paddle 2.0 API 映射表

安装2.6的paddlepaddle之后总是报fluid的错误&#xff0c;查询得知这个接口已经弃用了&#xff0c;但是一直找不到替换接口&#xff0c;偶然查询报错信息的时候找到了映射表&#xff0c;转存一下。 Paddle 1.8 与 Paddle 2.0 API 映射表

在React函数组件中使用错误边界和errorElement进行错误处理

在React 18中,函数组件可以使用两种方式来处理错误: 使用 ErrorBoundary ErrorBoundary 是一种基于类的组件,可以捕获其子组件树中的任何 JavaScript 错误,并记录这些错误、渲染备用 UI 而不是冻结的组件树。 在函数组件中使用 ErrorBoundary,需要先创建一个基于类的 ErrorB…

SAM在低阶自适应航空土地覆盖分类中的应用2024.01

GEOSCIENCE AND REMOTE SENSING LETTERS 2024.01 提出了一种新的语义分割模型&#xff0c;该模型结合了SAM的图像编码器和低秩自适应方法(LoRA)&#xff0c;用于航空图像的特征提取和微调。我们还使用了一个辅助CNN编码器来促进下游适应&#xff0c;并补充ViT编码器在密集视觉…

探索visionOS基础知识:创建应用程序图标

每当您使用不同的 Apple 平台时,您都会注意到必须学习如何为其设计本机应用程序图标。无论是 iOS、macOS 还是 tvOS,每个平台都有适合该特定平台的独特规范。 VisionOS 要求创建美观、三维、独特的应用程序图标,使主视图上感觉熟悉且逼真。 对于与 VisionOS 兼容的现有 …

js 连接快手打印组件并实现打印

快手打印组件文档&#xff1a; https://docs.qingque.cn/d/home/eZQA41D2h9LGUFaD26bC07e–?identityIdEmukFTnlEF#sectionh.kgnfm4rjc89m 快手打印组件下载&#xff1a; https://docs.qingque.cn/d/home/eZQBMOMSj4mJ5D7Xplofq-p4Y?identityIdEmukFTnlEF 快手打印数据格式&…

在ubuntu上搭建nexus私有仓库(指定版本以及jdk!)

前言 本来以为搭建一个nexus随随便便就好了&#xff0c;但是遇到了最新版本根本没办法在jdk17下面正常运行—起码我调了一下不知道怎么运行&#xff0c;我才知道。。。不升级版本其实是很有道理的。 这一篇是最新版本的尝试&#xff1a; 在ubuntu上搭建nexus私有仓库[失败草稿…