当前位置: 首页 > news >正文

使用云主机做网站教程网站信息报送制度建设

使用云主机做网站教程,网站信息报送制度建设,电子商务网站的构建,超级商城文章大纲 引言#xff1a;Python 中的类与面向对象编程概述 在编程世界中#xff0c;Python 作为一种简洁而强大的语言#xff0c;其面向对象编程#xff08;OOP#xff09;特性为开发者提供了结构化代码和模块化设计的强大工具。类#xff08;Class#xff09;是 Pyt…文章大纲 引言Python 中的类与面向对象编程概述 在编程世界中Python 作为一种简洁而强大的语言其面向对象编程OOP特性为开发者提供了结构化代码和模块化设计的强大工具。类Class是 Python 中实现 OOP 的核心机制它不仅是数据类型的蓝图更是封装数据和行为的有效方式。通过类开发者可以定义对象的属性和方法从而实现代码的重用性和可维护性。Python 的类机制既简单易用又蕴含丰富的特性适用于从小型脚本到复杂应用开发的各种场景。本文将从类的基本定义与实例化开始逐步深入到初始化方法、属性装饰器、作用域规则等基础概念并进一步探讨私有成员、内存管理及元类等高级主题。通过理论讲解与代码示例的结合帮助读者全面掌握 Python 中类与面向对象编程的精髓无论是初学者还是有经验的开发者都能从中受益。 类的基本定义与实例化 在 Python 中类Class是创建对象的模板通过 class 语句定义。其基本语法如下class ClassName:其中类名通常遵循 CapCase 命名约定即首字母大写以区分变量和函数名。类体中可以包含变量赋值类属性和函数定义方法这些内容共同构成了类的结构。 定义一个类后通过调用类名即可创建实例对象。例如 class Person:species Homo sapiens # 类属性def say_hello(self): # 方法定义print(Hello, world!)# 创建实例 p Person() print(p.species) # 访问类属性 p.say_hello() # 调用方法在上述代码中Person 是一个类p 是通过调用 Person() 创建的实例。实例可以访问类中定义的属性和方法self 参数是方法中用于引用调用该方法的实例的约定参数。通过这种方式类为数据的组织和行为的封装提供了基础。类的实例化过程简单直观但背后蕴含了 Python 对象模型的强大机制为后续的属性管理和继承等特性奠定了基础。 类实例作为结构或记录的使用 在 Python 中类实例不仅可以用于封装行为还可以作为结构或记录来存储数据。相比于其他静态类型语言如 Java 或 CPython 的类实例无需提前声明数据字段开发者可以动态地为实例添加属性。这种灵活性使得类实例非常适合用于表示简单的记录或数据结构。 例如我们可以创建一个 Circle 类来表示圆形并动态添加和访问其属性 class Circle:pass # 空类定义# 创建实例并动态添加属性 c Circle() c.radius 5 # 设置半径# 计算圆的周长 c.circumference 2 * 3.14159 * c.radius print(f圆的半径: {c.radius}) print(f圆的周长: {c.circumference})在上述代码中Circle 类最初是空的但我们可以在创建实例 c 后动态添加 radius 属性并基于此计算周长。这种方法非常灵活适合快速原型设计或临时数据存储。然而动态添加属性也可能导致代码可读性下降或属性名称拼写错误的风险因此在实际开发中通常建议通过初始化方法__init__预定义实例属性。 此外类实例作为记录使用时可以很方便地表示结构化数据。例如可以用类实例来表示一个简单的用户信息记录包含姓名、年龄等字段。这种用法类似于其他语言中的结构体struct但 Python 提供的动态特性让其更加灵活。通过类实例我们不仅能存储数据还能轻松扩展功能比如添加方法来操作这些数据。这种特性使得 Python 的类在数据建模和快速开发中具有显著优势。 初始化方法 __init__ 的使用与约定 在 Python 中__init__ 方法是一个特殊方法用于在创建类实例时初始化其状态。虽然常被误认为是构造器但它实际上并不是——Python 中的真正构造器是 __new__ 方法而 __init__ 仅在实例已经创建后被调用用于设置初始属性或执行其他初始化逻辑。它的主要作用是为新创建的实例绑定初始数据或执行必要的设置操作。 __init__ 方法的定义必须以 self 作为第一个参数这是一个约定表示调用该方法的实例本身。通过 self我们可以访问实例的属性和其他方法。以下是一个简单的示例展示如何使用 __init__ 初始化一个 Student 类的实例 class Student:def __init__(self, name, age):self.name name # 初始化实例属性self.age agedef introduce(self):print(f我是 {self.name}今年 {self.age} 岁。)# 创建实例并自动调用 __init__ s Student(Alice, 20) s.introduce() # 输出我是 Alice今年 20 岁。在上述代码中创建 Student 实例时Python 自动调用 __init__ 方法并将参数 Alice 和 20 传递给 name 和 age从而初始化实例的属性。需要注意的是__init__ 方法不需要显式返回任何值它的作用仅限于初始化。 与 Java 或 C 等语言中的构造器相比Python 的 __init__ 有一些独特之处。在 Java 中构造器的名称与类名相同而 Python 使用统一的 __init__ 名称简化了语法。此外Java 构造器可以有多个重载版本而 Python 不支持方法重载但可以通过默认参数或可变参数如 *args 和 **kwargs实现类似功能。例如 class Student:def __init__(self, name, age18):self.name nameself.age ages1 Student(Bob) # 使用默认 age18 s2 Student(Cathy, 22) # 指定 age print(s1.age) # 输出18 print(s2.age) # 输出22通过这种方式__init__ 方法提供了灵活的初始化机制。此外self 参数的使用是 Python 的一个重要约定它明确了方法与实例之间的关系使得代码更具可读性。虽然开发者可以为 self 参数选择其他名称但强烈建议遵循这一约定以避免混淆和风格不一致。 总之__init__ 是 Python 类中最为常用的特殊方法之一它为实例的初始化提供了简洁而强大的方式。通过合理设计 __init__ 方法可以确保对象在创建时处于有效的初始状态为后续操作奠定基础。 属性装饰器 property 的应用 在 Python 中属性装饰器 property 是一种强大的工具用于将方法转换为属性从而在访问和修改实例数据时提供更简洁的语法同时保持对数据访问的控制。它允许开发者将 getter 和 setter 方法隐藏在点号语法背后避免显式调用方法从而使代码更符合 Python 的直观风格。property 装饰器常用于需要对属性进行计算、验证或转换的场景。 以下是一个简单的示例展示如何使用 property 装饰器创建一个只读属性。我们以 Temperature 类为例用于表示温度并支持摄氏度和华氏度之间的转换 class Temperature:def __init__(self, celsius):self._celsius celsius # 使用下划线表示内部变量propertydef celsius(self):return self._celsiuspropertydef fahrenheit(self):return self._celsius * 9 / 5 32# 使用示例 temp Temperature(25) print(f摄氏度: {temp.celsius}) # 输出摄氏度: 25 print(f华氏度: {temp.fahrenheit}) # 输出华氏度: 77.0在上述代码中celsius 和 fahrenheit 被定义为属性而不是普通方法。通过 property 装饰器我们可以像访问普通属性一样使用 temp.celsius 和 temp.fahrenheit而不需要显式调用方法。这种方式不仅简化了代码还隐藏了底层计算逻辑例如华氏度的转换公式提高了代码的可读性。需要注意的是此处 fahrenheit 是一个只读属性因为我们没有定义对应的 setter 方法。 如果需要允许修改属性值可以结合 property 的 setter 装饰器来实现。例如我们可以为 celsius 属性添加 setter 方法以便在修改温度值时进行验证 class Temperature:def __init__(self, celsius):self._celsius celsiuspropertydef celsius(self):return self._celsiuscelsius.setterdef celsius(self, value):if value -273.15: # 验证温度不低于绝对零度raise ValueError(温度不能低于绝对零度 (-273.15°C))self._celsius valuepropertydef fahrenheit(self):return self._celsius * 9 / 5 32# 使用示例 temp Temperature(25) temp.celsius 30 # 修改摄氏度 print(f新的摄氏度: {temp.celsius}) # 输出新的摄氏度: 30 print(f新的华氏度: {temp.fahrenheit}) # 输出新的华氏度: 86.0 # temp.celsius -300 # 会抛出 ValueError在上述代码中celsius.setter 定义了 celsius 属性的 setter 方法允许用户通过 temp.celsius value 的语法修改温度值同时在 setter 方法中添加了验证逻辑确保温度不低于绝对零度。这种方式既保持了点号语法的简洁性又提供了对属性修改的控制能力。 property 装饰器的优点在于它将方法的调用伪装成属性访问符合 Python 的“显式优于隐式”理念同时避免了传统 getter 和 setter 方法的繁琐调用方式如 Java 中的 getCelsius() 和 setCelsius()。此外通过使用下划线前缀如 _celsius我们可以提示用户该变量是内部实现细节不建议直接访问从而实现一定程度上的封装。 总之property 装饰器是 Python 中实现属性管理的强大工具适用于需要计算属性、数据验证或转换的场景。通过合理使用 property 及其相关的 setter 装饰器开发者可以在保持代码简洁的同时对对象的行为和数据访问进行精细控制。 类的作用域规则与命名空间 在 Python 中类的作用域规则和命名空间管理是理解对象行为和属性访问机制的关键。命名空间namespace本质上是一个从名称到对象的映射Python 使用它来管理变量、方法和其他标识符的可见性和访问权限。在类和实例的上下文中命名空间决定了如何查找和解析属性名称其搜索顺序和规则直接影响代码的行为。 Python 中的命名空间可以分为几个层次本地命名空间local、全局命名空间global和内置命名空间built-in。在类方法中名称查找通常遵循以下顺序首先检查本地命名空间方法内的局部变量然后是实例的命名空间通过 self 访问实例属性接着是类的命名空间类属性或方法如果存在继承关系还会查找超类的命名空间最后才会检查全局和内置命名空间。这种层次化的查找机制确保了名称解析的清晰性和优先级。 以下是一个简单的代码示例展示命名空间的访问规则 class Example:class_var 类变量 # 类命名空间中的变量def __init__(self):self.instance_var 实例变量 # 实例命名空间中的变量def method(self):local_var 局部变量 # 本地命名空间中的变量print(local_var) # 首先查找本地命名空间print(self.instance_var) # 通过 self 访问实例命名空间print(self.class_var) # 通过 self 访问类命名空间也可以用 Example.class_var# 创建实例并调用方法 obj Example() obj.method()在上述代码中method 方法内的 local_var 位于本地命名空间中self.instance_var 位于实例的命名空间中而 self.class_var 则来自类的命名空间。通过 self 参数方法可以访问实例和类的属性这种机制确保了名称查找的灵活性和一致性。 为了更直观地说明命名空间的内容和访问权限可以通过以下表格总结不同命名空间的范围和作用 命名空间类型范围与作用访问方式本地命名空间方法或函数内部仅在当前作用域有效直接使用变量名实例命名空间特定实例的属性和数据每个实例独立通过 self.属性名 访问类命名空间类的属性和方法所有实例共享通过 self.属性名 或 类名.属性名 访问超类命名空间继承的父类属性和方法视继承关系而定通过 self.属性名 访问全局命名空间模块级别的变量和函数全局可见直接使用或通过 global 声明内置命名空间Python 内置的对象和函数如 print、len 等直接使用 在实际开发中self 参数是访问实例和类命名空间的核心工具。例如在方法中通过 self.some_attribute 访问属性时Python 会先在实例的命名空间中查找 some_attribute如果未找到则继续在类的命名空间中查找甚至沿着继承链向上查找超类的命名空间。这种动态查找机制是 Python 属性访问的基础。 此外类的命名空间在定义类时就已确定包含类属性和方法定义而实例的命名空间则在创建实例时动态生成通常通过 __init__ 方法初始化。需要注意的是如果在实例上设置一个与类属性同名的属性实例的命名空间会覆盖类的命名空间形成“遮蔽”效应。例如 class Test:shared 共享值obj1 Test() obj2 Test() obj1.shared obj1 的值 # 在实例命名空间中创建同名属性 print(obj1.shared) # 输出obj1 的值实例命名空间优先 print(obj2.shared) # 输出共享值类命名空间这种行为体现了 Python 命名空间的灵活性但也可能导致意外覆盖类属性的问题因此开发者需要谨慎管理属性名称。 为了进一步探索命名空间的实际应用可以参考一个简单的模块文件 cs.py其中定义了多个类和属性展示不同命名空间的内容和访问权限。通过类似模块的代码实践开发者可以更深入理解 Python 如何在实例、类和继承关系中解析名称。 总之类的作用域规则和命名空间是 Python 面向对象编程的重要基础。理解名称查找的优先级和不同命名空间的作用范围不仅有助于编写清晰、可维护的代码还能有效避免命名冲突和属性访问错误。通过熟练掌握 self 的用法以及命名空间的分层机制开发者可以更好地设计和管理复杂的类结构。 私有变量与方法的实现与限制 在 Python 中私有变量和方法的概念与其他面向对象语言如 Java 或 C有所不同。Python 并没有真正意义上的私有成员而是通过命名约定和名称改写name mangling机制来实现一种“伪私有”的效果。这种机制旨在提示开发者某些成员不应直接访问而非强制限制访问。 私有变量和方法的实现主要依赖于双下划线 __ 前缀。当一个变量或方法的名称以 __ 开头且不以 __ 结尾时Python 会对其进行名称改写。具体来说Python 会在内部将名称改写为 _类名__成员名 的形式以避免在子类中意外访问或覆盖父类的私有成员。例如 class MyClass:def __init__(self):self.__private_var 私有变量def __private_method(self):print(这是一个私有方法)def access_private(self):print(self.__private_var)self.__private_method()# 创建实例 obj MyClass() obj.access_private() # 输出私有变量 和 这是一个私有方法 # print(obj.__private_var) # 会抛出 AttributeError在上述代码中__private_var 和 __private_method 被标记为私有成员。如果直接尝试访问 obj.__private_varPython 会抛出 AttributeError因为名称已被改写为 _MyClass__private_var。这种名称改写机制使得私有成员在类外部或子类中难以直接访问从而提供了一定程度的封装。 然而这种私有性并不是绝对的。开发者仍然可以通过改写后的名称访问这些成员例如 print(obj._MyClass__private_var) # 输出私有变量这种行为表明Python 的私有机制更多是一种约定和提示而非强制限制。开发者应尊重这一约定避免直接访问以双下划线开头的成员以维护代码的封装性和可读性。 对于子类而言父类的私有成员由于名称改写而无法直接继承或访问。例如 class SubClass(MyClass):def try_access(self):# print(self.__private_var) # 会抛出 AttributeErrorprint(无法直接访问父类的私有成员)sub_obj SubClass() sub_obj.try_access() # 输出无法直接访问父类的私有成员在上述代码中SubClass 无法直接访问 MyClass 的 __private_var因为名称改写使得该成员在子类中不可见。如果需要在子类中访问父类的私有成员可以通过公共方法如 access_private间接访问或者使用改写后的名称但后者不被推荐。 需要注意的是Python 还支持单下划线 _ 前缀的命名约定用于表示“受保护”成员。这仅是一种更弱的提示表明该成员是内部实现细节不建议外部直接访问但 Python 不会对其进行名称改写访问权限完全不受限制。例如self._protected_var 可以在类外部自由访问但按照约定开发者应避免这种做法。 总之Python 中私有变量和方法的实现通过双下划线和名称改写机制提供了一定程度的封装但其本质是基于开发者自觉遵守的约定而非强制限制。这种设计体现了 Python 的灵活性和“显式优于隐式”理念同时也要求开发者在设计类时谨慎管理成员的可见性以避免不必要的访问冲突。通过合理使用私有成员可以提高代码的可维护性和模块化程度。 析构器与内存管理机制 在 Python 中析构器destructor是通过特殊方法 __del__ 实现的用于在对象被销毁时执行清理操作。然而与 C 等语言中的析构器不同Python 的 __del__ 方法并不能保证在对象销毁时立即被调用因为 Python 依赖于引用计数和垃圾回收机制来管理内存。这使得 __del__ 的使用场景较为有限通常不建议依赖它进行关键资源的释放。 Python 的内存管理主要基于引用计数机制。当一个对象的引用计数降为零时Python 解释器会自动销毁该对象并回收其占用的内存。在某些情况下如果对象之间存在循环引用垃圾回收器Garbage Collector, GC会介入检测并清理这些无法通过引用计数直接回收的对象。然而__del__ 方法的调用时机是不确定的尤其是在垃圾回收过程中开发者无法预测其执行顺序或是否会被调用。 以下是一个简单的 __del__ 方法示例展示其在对象销毁时的行为 class Resource:def __init__(self, name):self.name nameprint(f{self.name} 创建)def __del__(self):print(f{self.name} 销毁)# 创建并销毁对象 obj Resource(测试资源) obj None # 引用计数为零可能触发 __del__在上述代码中当 obj 被赋值为 None 后引用计数变为零对象可能被销毁并调用 __del__ 方法输出销毁信息。但在复杂的程序中由于垃圾回收的非确定性__del__ 可能不会立即执行甚至在程序结束时仍未被调用。 由于 __del__ 的不确定性Python 推荐使用上下文管理器通过 with 语句和 __enter__、__exit__ 方法或显式调用清理方法来管理外部资源如文件句柄、数据库连接等的释放。上下文管理器提供了一种更可靠的方式确保资源在不再需要时被正确关闭。例如 class SafeResource:def __init__(self, name):self.name nameself.opened Falsedef __enter__(self):self.opened Trueprint(f{self.name} 打开)return selfdef __exit__(self, exc_type, exc_val, exc_tb):self.opened Falseprint(f{self.name} 关闭)# 使用上下文管理器 with SafeResource(安全资源) as res:print(使用资源中) # 自动调用 __exit__确保资源关闭在上述代码中with 语句确保即使发生异常资源的关闭操作也会执行这比依赖 __del__ 更安全可靠。 总之Python 的析构器 __del__ 虽然存在但由于其调用时机不可预测不适合用于关键资源的释放。Python 的引用计数和垃圾回收机制已经能够很好地自动管理内存而对于需要显式释放外部资源的场景上下文管理器是最佳实践。通过理解这些机制开发者可以编写更健壮和可维护的代码避免资源泄漏和内存管理问题。 高级主题__new__ 方法与元类简介 在 Python 中__new__ 方法是一个特殊方法被认为是类的真正构造器与 __init__ 不同__new__ 负责创建对象本身而 __init__ 仅在对象创建后进行初始化。__new__ 方法在实例化过程中首先被调用其主要任务是返回一个新的实例对象通常是调用父类的 __new__ 方法来完成对象的创建。它接受的参数是类本身cls以及传递给类构造函数的其他参数。 __new__ 方法的主要应用场景包括子类化不可变类型如 str、tuple以及实现单例模式等设计模式。例如在子类化不可变类型时__new__ 可以用来控制对象的创建过程 class CustomString(str):def __new__(cls, value):# 在创建对象时进行自定义处理print(f创建 CustomString 对象值为 {value})return super().__new__(cls, value)# 创建实例 s CustomString(Hello) print(s) # 输出Hello在上述代码中__new__ 方法在创建 CustomString 对象时被调用并返回一个新的字符串对象。通过重写 __new__我们可以在对象创建阶段执行自定义逻辑这在 __init__ 中是无法实现的因为不可变类型的初始化受到限制。 另一个重要的相关概念是元类metaclass它是用于创建类的“类”。元类允许开发者在类定义时干预类的创建过程例如修改类的属性、方法或继承行为。元类通过将 metaclass 参数指定为一个自定义类来实现通常需要重写元类的 __new__ 或 __init__ 方法。以下是一个简单的元类示例 class MetaClass(type):def __new__(cls, name, bases, dct):print(f创建类 {name})return super().__new__(cls, name, bases, dct)# 使用元类创建类 class MyClass(metaclassMetaClass):pass在上述代码中MetaClass 是一个元类通过重写 __new__ 方法我们可以在类 MyClass 被定义时执行自定义逻辑。元类在框架开发中非常有用例如 Django 的模型系统就依赖元类来实现 ORM 功能。 需要注意的是__new__ 和元类在日常开发中并不常见它们通常用于解决特定的高级问题如框架设计或底层定制。对于大多数开发者来说理解它们的概念和基本用法已足够实际项目中应谨慎使用以避免代码复杂性增加。通过掌握 __new__ 和元类的基本原理开发者可以在需要时灵活应对复杂的对象创建和类定义需求。 实践案例综合应用与属性更新 在本节中我们将通过一个实践案例综合应用本文讨论的 Python 类与面向对象编程的多个概念包括初始化方法、属性装饰器和命名空间规则。我们以 Rectangle 类为例设计一个表示矩形的类要求能够更新矩形的尺寸属性宽度和高度并确保尺寸值不可为负数。通过这个案例读者可以更好地理解如何将理论知识应用于实际代码开发中。 以下是 Rectangle 类的完整实现展示了如何使用 __init__ 方法初始化属性、使用 property 装饰器管理属性访问以及通过 setter 方法进行数据验证 class Rectangle:def __init__(self, width, height):# 使用 setter 方法初始化宽度和高度确保验证逻辑被应用self.width widthself.height heightpropertydef width(self):return self._widthwidth.setterdef width(self, value):if value 0:raise ValueError(宽度必须为正数)self._width valuepropertydef height(self):return self._heightheight.setterdef height(self, value):if value 0:raise ValueError(高度必须为正数)self._height valuepropertydef area(self):# 计算矩形面积作为只读属性return self._width * self._heightdef resize(self, width, height):# 提供一个方法同时更新宽度和高度self.width widthself.height heightprint(f矩形尺寸已更新为宽度{self.width}高度{self.height})# 测试代码 try:# 创建一个矩形实例rect Rectangle(5, 3)print(f初始面积: {rect.area}) # 输出初始面积: 15# 更新尺寸rect.resize(10, 4)print(f更新后面积: {rect.area}) # 输出更新后面积: 40# 尝试设置负值触发异常rect.width -1 except ValueError as e:print(f错误: {e}) # 输出错误: 宽度必须为正数在上述代码中Rectangle 类通过 __init__ 方法初始化矩形的宽度和高度。注意到初始化时直接调用了 self.width 和 self.height而不是直接赋值给内部变量 _width 和 _height这是为了确保 setter 方法的验证逻辑在初始化时也被应用。property 装饰器用于定义 width 和 height 作为属性结合 setter 方法实现了对尺寸值的验证确保宽度和高度始终为正数。此外area 作为一个只读属性动态计算矩形的面积体现了属性装饰器在计算属性中的应用。 命名空间规则在本案例中也有体现。内部变量 _width 和 _height 存储在实例的命名空间中通过 self 访问而 getter 和 setter 方法则位于类的命名空间中。这种分层管理确保了数据和行为的清晰分离提高了代码的可维护性。同时resize 方法展示了如何在类中定义辅助方法简化对属性的批量更新操作。 通过这个案例我们可以看到 Python 类设计的灵活性和强大之处。property 装饰器使得属性访问既简洁又可控__init__ 方法为初始化提供了便利而命名空间规则则确保了属性和方法访问的清晰性。在实际开发中类似的设计可以应用于各种场景例如表示几何形状、用户配置或其他需要数据验证和动态计算的领域。通过综合应用这些概念开发者可以编写出更加健壮和可扩展的代码。
http://www.w-s-a.com/news/361675/

相关文章:

  • 网页制作网站素材项目建设全过程管理
  • 正能量网站下载柬埔寨网赌网站开发
  • 如何免费建设公司网站广州传业建设有限公司网站
  • 织梦做的网站快照被攻击张家口网站建设公司
  • 平顶山公司网站建设南昌网站seo多少钱
  • 网站开发要先买服务器吗建设婚恋网站用什么搭建
  • 我想自己在网站上发文章 怎样做wordpress站点安装
  • 北京模板网站开发全包昆明网站开发正规培训
  • 西咸新区建设环保网站谷歌风格wordpress
  • 嘉兴港区建设局网站2018年网站开发
  • 网站里图片做超链接专业开发网站报价单
  • server2003网站建设做销售记住这十句口诀
  • microsoft免费网站网站后台登陆路径
  • 贵州住房和城乡建设局网站做网站排名费用多少钱
  • 现在个人做网站还能盈利吗xampp用wordpress
  • 做网站 租服务器温岭建设公司网站
  • 四川住房和城乡建设厅网站官网做网站最贵
  • 右玉网站建设四川林峰脉建设工程有限公司网站
  • 网站推广小助手杭州百度百家号seo优化排名
  • 怎么做网站搜索框搜索网站备案拍照背景幕布
  • 建设部网站城市规划资质标准伊春网络推广
  • 如何设计酒店网站建设深圳市房地产信息系统平台
  • 伍佰亿网站怎么样网站建设前台后台设计
  • 做整装的网站北京哪个网站制作公司
  • 建设赚钱的网站福州便民生活网
  • 咸阳网站设计建设公司小程序打包成app
  • 做视频网站视频文件都存放在哪做旅游宣传图的网站有哪些
  • 地方门户类网站产品推广惠州市中国建设银行网站
  • 网站建设公司推荐5788移动版wordpress
  • 产品类型 速成网站淘宝怎么建立自己的网站