【rpm 源码安装】【grafana前端源码】【钻石红包源码】Pythonclass源码

2024-11-24 21:44:12 来源:bat后门源码 分类:焦点

1.说说 Python 的元编程
2.如何查看python库函数的代码?
3.教你阅读 Cpython 的源码(一)
4.python怎么看package源码
5.python源程序执行的方式
6.软件源代码是什么意思?

Pythonclass源码

说说 Python 的元编程

       æåˆ°å…ƒè¿™ä¸ªå­—,你也许会想到元数据,元数据就是描述数据本身的数据,元类就是类的类,相应的元编程就是描述代码本身的代码,元编程就是关于创建操作源代码(比如修改、生成或包装原来的代码)的函数和类。主要技术是使用装饰器、元类、描述符类。

       æœ¬æ–‡çš„主要目的是向大家介绍这些元编程技术,并且给出实例来演示它们是怎样定制化源代码的行为。

       è£…饰器 装饰器就是函数的函数,它接受一个函数作为参数并返回一个新的函数,在不改变原来函数代码的情况下为其增加新的功能,比如最常用的计时装饰器:

from functools import wrapsdef timeit(logger=None):"""耗时统计装饰器,单位是秒,保留 4 位小数"""def decorator(func):@wraps(func)def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)end = time.time()if logger:logger.info(f"{ func.__name__} cost { end - start :.4f} seconds")else:print(f"{ func.__name__} cost { end - start :.4f} seconds")return resultreturn wrapperreturn decorator

       (注:比如上面使用 @wraps(func) 注解是很重要的, 它能保留原始函数的元数据) 只需要在原来的函数上面加上 @timeit() 即可为其增加新的功能:

@timeit()def test_timeit():time.sleep(1)test_timeit()#test_timeit cost 1. seconds

       ä¸Šé¢çš„代码跟下面这样写的效果是一样的:

test_timeit = timeit(test_timeit)test_timeit()

       è£…饰器的执行顺序 当有多个装饰器的时候,他们的调用顺序是怎么样的?

       å‡å¦‚有这样的代码,请问是先打印 Decorator1 还是 Decorator2 ?

from functools import wrapsdef decorator1(func):@wraps(func)def wrapper(*args, **kwargs):print('Decorator 1')return func(*args, **kwargs)return wrapperdef decorator2(func):@wraps(func)def wrapper(*args, **kwargs):print('Decorator 2')return func(*args, **kwargs)return wrapper@decorator1@decorator2def add(x, y):return x + yadd(1,2)# Decorator 1# Decorator 2

       å›žç­”这个问题之前,我先给你打个形象的比喻,装饰器就像函数在穿衣服,离它最近的最先穿,离得远的最后穿,上例中 decorator1 是外套,decorator2 是内衣。

       add = decorator1(decorator2(add))

       åœ¨è°ƒç”¨å‡½æ•°çš„时候,就像脱衣服,先解除最外面的 decorator1,也就是先打印 Decorator1,执行到 return func(

       args, kwargs) 的时候会去解除 decorator2,然后打印 Decorator2,再次执行到 return func(

       args, kwargs) 时会真正执行 add() 函数。

       éœ€è¦æ³¨æ„çš„是打印的位置,如果打印字符串的代码位于调用函数之后,像下面这样,那输出的结果正好相反:

def decorator1(func):@wraps(func)def wrapper(*args, **kwargs):result = func(*args, **kwargs)print('Decorator 1')return resultreturn wrapperdef decorator2(func):@wraps(func)def wrapper(*args, **kwargs):result = func(*args, **kwargs)print('Decorator 2')return resultreturn wrapper

       è£…饰器不仅可以定义为函数,也可以定义为类,只要你确保它实现了__call__() 和 __get__() 方法。

       å…ƒç±» Python 中所有类(object)的元类,就是 type 类,也就是说 Python 类的创建行为由默认的 type 类控制,打个比喻,type 类是所有类的祖先。我们可以通过编程的方式来实现自定义的一些对象创建行为。

       å®šä¸€ä¸ªç±»ç»§æ‰¿ type ç±» A,然后让其他类的元类指向 A,就可以控制 A 的创建行为。典型的就是使用元类实现一个单例:

class Singleton(type):def __init__(self, *args, **kwargs):self._instance = Nonesuper().__init__(*args, **kwargs)def __call__(self, *args, **kwargs):if self._instance is None:self._instance = super().__call__(*args, **kwargs)return self._instanceelse:return self._instanceclass Spam(metaclass=Singleton):def __init__(self):print("Spam!!!")

       å…ƒç±» Singleton 的__init__和__new__ 方法会在定义 Spam 的期间被执行,而 __call__方法会在实例化 Spam 的时候执行。

       descriptor 类(描述符类)

       descriptor 就是任何一个定义了 __get__(),__set__()或 __delete__()的对象,描述器让对象能够自定义属性查找、存储和删除的操作。这里举官方文档[1]一个自定义验证器的例子。

       å®šä¹‰éªŒè¯å™¨ç±»ï¼Œå®ƒæ˜¯ä¸€ä¸ªæè¿°ç¬¦ç±»ï¼ŒåŒæ—¶è¿˜æ˜¯ä¸€ä¸ªæŠ½è±¡ç±»ï¼š

from abc import ABC, abstractmethodclass Validator(ABC):def __set_name__(self, owner, name):self.private_name = '_' + namedef __get__(self, obj, objtype=None):return getattr(obj, self.private_name)def __set__(self, obj, value):self.validate(value)setattr(obj, self.private_name, value)@abstractmethoddef validate(self, value):pass

       è‡ªå®šä¹‰éªŒè¯å™¨éœ€è¦ä»Ž Validator 继承,并且必须提供 validate() 方法以根据需要测试各种约束。

       è¿™æ˜¯ä¸‰ä¸ªå®žç”¨çš„数据验证工具:

       OneOf 验证值是一组受约束的选项之一。

class OneOf(Validator):def __init__(self, *options):self.options = set(options)def validate(self, value):if value not in self.options:raise ValueError(f'Expected { value!r} to be one of { self.options!r}')

       Number 验证值是否为 int 或 float。根据可选参数,它还可以验证值在给定的最小值或最大值之间。

class Number(Validator):def __init__(self, minvalue=None, maxvalue=None):self.minvalue = minvalueself.maxvalue = maxvaluedef validate(self, value):if not isinstance(value, (int, float)):raise TypeError(f'Expected { value!r} to be an int or float')if self.minvalue is not None and value < self.minvalue:raise ValueError(f'Expected { value!r} to be at least { self.minvalue!r}')if self.maxvalue is not None and value > self.maxvalue:raise ValueError(f'Expected { value!r} to be no more than { self.maxvalue!r}')

       String 验证值是否为 str。根据可选参数,它可以验证给定的最小或最大长度。它还可以验证用户定义的 predicate。

class String(Validator):def __init__(self, minsize=None, maxsize=None, predicate=None):self.minsize = minsizeself.maxsize = maxsizeself.predicate = predicatedef validate(self, value):if not isinstance(value, str):raise TypeError(f'Expected { value!r} to be an str')if self.minsize is not None and len(value) < self.minsize:raise ValueError(f'Expected { value!r} to be no smaller than { self.minsize!r}')if self.maxsize is not None and len(value) > self.maxsize:raise ValueError(f'Expected { value!r} to be no bigger than { self.maxsize!r}')if self.predicate is not None and not self.predicate(value):raise ValueError(f'Expected { self.predicate} to be true for { value!r}')

       å®žé™…应用时这样写:

@timeit()def test_timeit():time.sleep(1)test_timeit()#test_timeit cost 1. seconds0

       æè¿°å™¨é˜»æ­¢æ— æ•ˆå®žä¾‹çš„创建:

@timeit()def test_timeit():time.sleep(1)test_timeit()#test_timeit cost 1. seconds1

       æœ€åŽçš„话 关于 Python 的元编程,总结如下:

       å¦‚果希望某些函数拥有相同的功能,希望不改变原有的调用方式、不写重复代码、易维护,可以使用装饰器来实现。

       å¦‚果希望某一些类拥有某些相同的特性,或者在类定义实现对其的控制,我们可以自定义一个元类,然后让它类的元类指向该类。

       å¦‚果希望实例的属性拥有某些共同的特点,就可以自定义一个描述符类。

       ä»¥ä¸Šå°±æ˜¯æœ¬æ¬¡åˆ†äº«çš„所有内容,如果你觉得文章还不错,欢迎关注公众号:Python编程学习圈,每日干货分享,内容覆盖Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是前往编程学习网,了解更多编程技术知识。

原文:/post/

如何查看python库函数的代码?

       1. Python的所有版本源代码可以从官方网站下载:[Python 官方下载地址](https://www.python.org/downloads/source/)。

       2. 不同于MATLAB,Python没有直接显示函数源代码的功能。要查看某个函数的源代码,需要下载整个Python源代码包,自行查找相关文件。rpm 源码安装

       3. 可以通过编写小程序来查看特定函数的源代码。Python函数通常通过`import`语句导入相应的`.py`文件。

       4. 库函数分为内置函数(build-in functions)和通过`pip`安装的外部函数。两者本质上是`.py`文件。

       5. 安装的外部函数可能因为环境配置不同而需要调整。通常这些函数位于安装路径下的`\Lib\site-packages`文件夹中。

       6. 学习库函数的最佳方式是阅读官方文档。此外,可以使用Python的`dir()`函数查看对象的所有属性和方法,或者使用`help()`函数获取帮助文档信息,尽管这些对于第三方库可能不完全适用。

       7. 推荐使用`ipython`,这是一个由Python创始人之一开发的交互式系统,能够提供更好的交互体验。

教你阅读 Cpython 的grafana前端源码源码(一)

       目录

1. CPython 介绍

       在Python使用中,你是否曾好奇字典查找为何比列表遍历快?生成器如何记忆变量状态?Cpython,作为流行版本,其源代码为何选择C和Python编写?Python规范,内存管理,这里一一揭示。

       文章将深入探讨Cpython的内部结构,分为五部分:编译过程、解释器进程、编译器和执行循环、对象系统、以及标准库。了解Cpython如何工作,从源代码下载、编译设置,到Python模块和C模块的使用,让你对Python核心概念有更深理解。

       2. Python 解释器进程

       学习过程包括配置环境、文件读取、词法句法解析,直至抽象语法树。钻石红包源码理解这些步骤,有助于你构建和调试Python代码。

       3. Cpython 编译与执行

       了解编译过程如何将Python代码转换为可执行的中间语言,以及字节码的缓存机制,将帮助你认识Python的编译性质。

       4. Cpython 中的对象

       从基础类型如布尔和整数,到生成器,深入剖析对象类型及其内存管理,让你掌握Python数据结构的核心。

       5. Cpython 标准库

       Python模块和C模块的交互,以及如何进行自定义C版本的安装,这些都是Cpython实用性的体现。

       6. 源代码深度解析

       从源代码的细节中,你会发现编译器的工作原理,以及Python语言规范和tokenizer的重要性,以及内存管理机制,如引用计数和垃圾回收。

       通过本文,你将逐步揭开Cpython的神秘面纱,成为Python编程的游戏源码 skynet高手。继续深入学习,提升你的Python技能。

       最后:结论

       第一部分概述了源代码、编译和Python规范,后续章节将逐步深入,让你在实践中掌握Cpython的核心原理。

       更多Python技术,持续关注我们的公众号:python学习开发。

python怎么看package源码

       要查看Python package的源码,首先需要确定源码的位置。如果你可以在命令行中运行Python,可以使用以下命令来查找目录。

       1. 打开命令行工具。

       2. 输入以下命令并执行:

        ```

        import string

        print(string.__file__)

        ```

        这将会显示类似以下的路径:`/usr/lib/python2.7/string.pyc`

       3. 对应路径下的`string.py`文件就是package的源码文件。需要注意的是,有些库可能是用C语言编写的,这时你可能会看到类似“没有找到模块”的错误。对于这样的库,你需要下载Python的源码,以便查看C语言实现的post攻击源码细节。

       请记住,不同版本的Python可能会有不同的路径和文件名。如果你在查找特定package的源码时遇到困难,可以尝试查找该package在Python官方文档中的页面,通常那里会提供源码的链接。

       如果这个回答解决了你的问题,希望你能采纳。如果还有其他疑问,欢迎继续提问。

python源程序执行的方式

       Python源程序可以通过多种方式执行,其中最常见的方式是通过Python解释器直接运行。Python解释器是一种内置的程序,它能够将Python源代码翻译成可执行的字节码,并由Python虚拟机执行。另外,Python代码也可以通过集成开发环境(IDE)或文本编辑器中的编译选项进行编译和执行。此外,Python代码还可以通过打包成可执行文件或使用第三方工具进行分发和执行。这些工具通常会将Python代码编译成字节码或转换为其他可执行格式,以便在没有Python解释器的环境中运行。总之,Python源程序可以通过多种方式执行,具体方式取决于代码的编写和部署需求。

软件源代码是什么意思?

       软件源代码是指用于开发计算机软件的原始编程代码,它是以某种编程语言编写的,由程序员创建并用于构建软件应用程序的基础。

       源代码是软件开发的基石,它包含了程序的所有逻辑、算法和指令,是计算机能够理解和执行的指令集合。程序员使用特定的编程语法和规则,如变量、函数、条件语句、循环等,来编写源代码。这些代码经过编译或解释后,最终转换成计算机可以执行的机器语言。

       举个例子,如果我们想编写一个简单的计算器程序,我们可能会使用像Python这样的编程语言来编写源代码。源代码可能包含接收用户输入、进行数学运算以及显示结果的指令。例如:

       python

       # 这是一个简单的Python源代码示例,用于实现一个加法计算器

       def add_numbers(num1, num2):

       return num1 + num2

       num1 = float(input("请输入第一个数字: "))

       num2 = float(input("请输入第二个数字: "))

       result = add_numbers(num1, num2)

       print("两个数字的和是:", result)

       这段代码定义了一个函数`add_numbers`,用于将两个数字相加,并通过`input`函数获取用户输入的两个数字。最后,它使用`print`函数显示两个数字的和。这就是一个简单的软件源代码示例。

       软件源代码的编写是一个复杂的过程,需要程序员具备扎实的编程基础和对特定编程语言的熟练掌握。源代码的质量直接影响最终软件的质量和性能。因此,在软件开发过程中,对源代码的编写、测试和维护都非常重要。

python代码大全简单?

       python有趣的编程代码

       class?Point:

row=0

col=0

def?__init__(self,?row,?col):

       self.row=row

       self.col=col

def?copy(self):

       return?Point(row=self.row,?col=self.col)

       #初始框架

       import?pygame

       import?random

       #初始化

       pygame.init()

       W=

       H=

       ROW=

       COL=

       size=(W,H)

       window=pygame.display.set_mode(size)

       pygame.display.set_caption('贪吃蛇')

       bg_color=(,,)

       snake_color=(,,)

       head=Point(row=int(ROW/2),?col=int(COL/2))

       head_color=(0,,)

       snakes=[

Point(row=head.row,?col=head.col+1),

Point(row=head.row,?col=head.col+2),

Point(row=head.row,?col=head.col+3)

       ]

       #生成食物

       def?gen_food():

while?1:

       pos=Point(row=random.randint(0,ROW-1),?col=random.randint(0,COL-1))

       #

       is_coll=False

       #是否跟蛇碰上了

       if?head.row==pos.row?and?head.col==pos.col:

is_coll=True

       #蛇身子

       for?snake?in?snakes:

if?snake.row==pos.row?and?snake.col==pos.col:

       is_coll=True

       break

       if?not?is_coll:

break

return?pos

       #定义坐标

       food=gen_food()

       food_color=(,,0)

       direct='left'#left,right,up,down

       #

       def?rect(point,?color):

cell_width=W/COL

cell_height=H/ROW

left=point.col*cell_width

top=point.row*cell_height

pygame.draw.rect(

       window,?color,

       (left,?top,?cell_width,?cell_height)

)

pass

       #游戏循环

       quit=True

       clock=pygame.time.Clock()

       while?quit:

#处理事件

for?event?in?pygame.event.get():

       if?event.type==pygame.QUIT:

quit=False

       elif?event.type==pygame.KEYDOWN:

if?event.key==?or?event.key==:

       if?direct=='left'?or?direct=='right':

direct='up'

elif?event.key==?or?event.key==:

       if?direct?==?'left'?or?direct?==?'right':

direct='down'

elif?event.key==?or?event.key==:

       if?direct?==?'up'?or?direct?==?'down':

direct='left'

elif?event.key==?or?event.key==:

       if?direct?==?'up'?or?direct?==?'down':

direct='right'

#吃东西

eat=(head.row==food.row?and?head.col==food.col)

#重新产生食物

if?eat:

       food?=?gen_food()

#处理身子

#1.把原来的头,插入到snakes的头上

snakes.insert(0,?head.copy())

#2.把snakes的最后一个删掉

if?not?eat:

       snakes.pop()

#移动

if?direct=='left':

       head.col-=1

elif?direct=='right':

       head.col+=1

elif?direct=='up':

       head.row-=1

elif?direct=='down':

       head.row+=1

#检测

dead=False

#1.撞墙

if?head.col0?or?head.row0?or?head.col=COL?or?head.row=ROW:

       dead=True

#2.撞自己

for?snake?in?snakes:

       if?head.col==snake.col?and?head.row==snake.row:

dead=True

break

if?dead:

       print('死了')

       quit=False

#渲染——画出来

#背景

pygame.draw.rect(window,?bg_color,?(0,0,W,H))

#蛇头

for?snake?in?snakes:

       rect(snake,?snake_color)

rect(head,?head_color)

rect(food,?food_color)

#

pygame.display.flip()

#设置帧频(速度)

clock.tick(8)

       #收尾工作

       è¿™æ˜¯ä¸€ä¸ªç®€æ˜“版贪吃蛇的代码,虽然结构简单,但是该有的功能都是完整的,可玩性也不错

求python数据标准化代码?

       ä½¿ç”¨python标准化数据的代码如下:

       fromsklearnimportpreprocessing

       importnumpyasnp

       X=np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])

       X_scaled=preprocessing.scale(X)

       print(X_scaled)

python圣诞树代码简单

       ```python#Python圣诞树代码foriinrange(1,6):forjinrange(1,i+1):print('*',end='')print('\n')```

       æ‹“展:如果想改变树的形状,可以在代码中添加更多的控制参数,如在每一行中添加不同的空格数,使得树的形状不一样。同时可以通过添加HTML标签,使用CSS样式来改变圣诞树的颜色、背景和文字等等。

       ä¸ªæžç®€python代码,拿走即用

       Hello,大家好,我是程序汪小成~

       è™½ç„¶python是一个易入门的语言,但是很多人依然还是会问到底怎么样学Python才最快,答案当然是实战各种小项目,只有自己去想与写,才记得住规则。本文写的是个极简任务,初学者可以尝试着自己实现;本文同样也是段代码,Python开发者也可以看看是不是有没想到的用法。

       ä»¥ä¸‹æ–¹æ³•å¯ä»¥æ£€æŸ¥ç»™å®šåˆ—表是不是存在重复元素,它会使用set()函数来移除所有重复元素。

       ç»™å®šå…·ä½“的大小,定义一个函数以按照这个大小切割列表。

       è¿™ä¸ªæ–¹æ³•å¯ä»¥å°†å¸ƒå°”型的值去掉,例如(False,None,0,“”),它使用filter()函数。

       æˆ‘们常用For循环来遍历某个列表,同样我们也能枚举列表的索引与值。

       å¦‚下代码段可以将打包好的成对列表解开成两组不同的元组。

       è¯¥æ–¹æ³•å°†é€šè¿‡é€’归的方式将列表的嵌套展开为单个列表。

       è¯¥æ–¹æ³•å°†è¿”回第一个列表的元素,且不在第二个列表内。如果同时要反馈第二个列表独有的元素,还需要加一句set_b.difference(set_a)。

       å¦‚下代码块可以用来计算执行特定代码所花费的时间。

       è¯¥ç®—法会打乱列表元素的顺序,它主要会通过Fisher-Yates算法对新列表进行排序:

       ä¸éœ€è¦é¢å¤–的操作就能交换两个变量的值。

       ä»¥ä¸Šï¼Œæ˜¯æˆ‘简单列举的十个python极简代码,拿走即用,希望对你有所帮助!

python新手代码有哪些?

       python新手代码有如下:

       defnot_empty(s)。

       returnsandlen(s。strip())0。

       #returnsands。strip()。

       #如果直接单写s。strip()那么s如果是None,会报错,因为None没有strip方法。

       #如果s是None,那么Noneand任何值都是False,直接返回false。

       #如果s非None,那么判定s。trip()是否为空。

       ç›¸å…³ç®€ä»‹ã€‚

       Python解释器易于扩展,可以使用C或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。

       å¹´æœˆï¼Œè¯­è¨€æµè¡ŒæŒ‡æ•°çš„编译器Tiobe将Python加冕为最受欢迎的编程语言,年来首次将其置于Java、C和JavaScript之上。

质数表代码?

       è´¨æ•°è¡¨ä»£ç æ˜¯æŒ‡ç”¨ç¼–程语言生成一系列质数的代码。质数是指只能被自身和1整除的自然数,如2,3,5,7等。

       ä¸åŒçš„编程语言有不同的实现方法,我可以给你一些参考。以下是一些网上搜索到的质数表代码示例:

       C语言:

       #includestdio.hintmain(){ ?inti,j;?printf("2\n");?for(i=3;i=;i+=2)//从3开始遍历奇数

{ for(j=3;ji;j++)//判断是否能被小于它的奇数整除

       { ?if(i%j==0)//如果能整除,则跳出循环

       break;

       }if(j==i)//如果循环正常结束,则说明是质数,打印出来

printf("%d\n",i);

}?return0;

       }

       Python:

       #!/usr/bin/python#-*-coding:UTF-8-*-

       #输出指定范围内的素数

       #用户输入数据lower=int(input("输入区间最小值:"))

       upper=int(input("输入区间最大值:"))

       fornuminrange(lower,upper+1):?#素数大于1

ifnum1:foriinrange(2,num):?if(num%i)==0:break

       else:?print(num)

初学Python,有哪些Pythonic的源码推荐阅读

       1. 初学Python时,阅读Pythonic的源码是提高编程技能的有效方法。推荐从Python标准库中关于网络编程的代码开始学习。

       2. 首先,深入研究`SocketServer`模块,它为创建服务器提供了基础。同时,学习与之相关的`socket`模块,掌握TCP和UDP编程的基础知识。

       3. 接下来,关注`SocketServer`模块中的`ForkingMixIn`和`ThreadingMixIn`类,它们分别展示了forking和threading并发机制的混合使用,这是理解多线程和多进程编程的重要途径。

       4. 了解`thread`和`threading`模块,这对于管理并发执行的线程至关重要。

       5. 随后,研究`select`模块,它允许你处理I/O多路复用,这是理解操作系统如何高效处理并发I/O操作的关键。

       6. 通过学习`select`模块,你将自然过渡到对`selectors`的理解,这是Python 3.7引入的更现代的I/O多路复用API。

       7. 对于想要深入了解并发编程的初学者,可以学习`asyncore`和`asynchat`模块,它们是异步网络编程的基础。

       8. 在网络编程的基础上,如果你的兴趣在于游戏开发或实时应用,可以探索`greenlet`和`gevent`,这些库提供了协程,有助于编写高效的并发代码。

       9. 如果你对Web开发感兴趣,从`BaseHTTPServer`、`SimpleHTTPServer`和`CGIHTTPServer`开始你的学习之旅。这些模块可以帮助你理解基本的Web服务器和CGI(Common Gateway Interface)。

       . 学习`cgi`和`cgitb`模块,这对于调试和运行CGI脚本非常有用。

       . 掌握`cookielib`模块,它处理HTTP cookies,这对于处理用户会话和状态管理至关重要。

       . 阅读`wsgiref`模块的源码,它是一个WSGI(Web Server Gateway Interface)参考实现,有助于你理解现代Web框架的工作原理。

       . 学习如何编写自己的简单Web框架后,你可以更容易地理解并选择`Flask`、`Web.py`、`Django`或`Pyramid`等流行的Web框架。

       . 在进行Web开发时,不可避免地需要与API进行交互。因此,熟悉`httplib`、`urllib`和`urlparse`模块是很重要的,它们帮助你处理HTTP请求和响应。

       通过以上步骤,初学者可以逐步建立起对Python网络和Web编程的深刻理解,为进一步的编程之旅打下坚实的基础。

本文地址:http://5o.net.cn/html/18b255497427.html 欢迎转发