如何获取py文件中所有类名并存储至列表中
时间: 2023-06-27 16:05:38 浏览: 104
你可以使用Python内置的`inspect`模块来获取一个py文件中所有的类名,然后将其存储到一个列表中。以下是一个示例代码:
```python
import inspect
def get_class_names(file_path):
class_names = []
with open(file_path, 'r') as f:
for line in f:
if 'class' in line:
name = line.split()[1]
class_names.append(name)
return class_names
file_path = 'example.py'
classes = get_class_names(file_path)
print(classes)
```
这个函数接受一个文件路径作为参数,打开文件并逐行读取。如果某一行包含关键字"class",则从该行中提取类名并将其添加到类名列表中。最后返回类名列表。
请注意,这种方法仅适用于在文件中定义的类,而不是导入的类。如果你需要获取导入的类名,可以使用`dir()`函数来获取模块中的所有名称,然后筛选出类名称。
相关问题
全局路径搜索Python文件,用is.wolk 拼接路径,importing.import-module获取属性便利属性判断是否为类函数,返回结果,文件路径,类名,函数名,函数输入参数以及类型,前提条件是带有装饰器的函数
以下是一个可能实现你想要的功能的 Python 代码:
```python
import os
import inspect
import importing
def find_decorated_functions(start_dir):
# 存储结果的列表
results = []
# 遍历目录中的所有 Python 文件
for root, dirs, files in os.walk(start_dir):
for file in files:
if file.endswith(".py"):
# 构造文件路径
path = os.path.join(root, file)
# 使用 importing 模块导入模块
module = importing.import_module(os.path.splitext(path)[0])
# 检查模块中的所有属性
for name, obj in inspect.getmembers(module):
# 如果属性是函数并且带有装饰器
if inspect.isfunction(obj) and hasattr(obj, "__wrapped__"):
# 获取函数的输入参数及其类型
signature = inspect.signature(obj)
params = []
for param in signature.parameters.values():
params.append((param.name, param.annotation))
# 存储结果
results.append((path, obj.__wrapped__.__qualname__, obj.__name__, params))
return results
```
这个函数会在指定目录下查找所有 Python 文件,并尝试导入每个文件中的模块。然后,它会检查模块中的每个属性,如果属性是一个带有装饰器的函数,则会提取函数的输入参数及其类型,并返回结果。返回值是一个列表,其中每个元素都是一个包含文件路径、类名、函数名和函数输入参数及其类型的元组。
用PY写一个PC版(不是网页版)微信软件聊天辅助工具, 程序要用到import win32gui import win32con d盘中的笑话合集.TXT是一个笑话的集合,文档中每个笑话的间隔是空行 要求每间隔20分钟向指定名字的好友按指定一个笑话, 如果收到“有病”“傻”“有毛病啊”停止发送 如果收到’看过了‘’没意思‘就再发下一个笑话
以下是一个可能的解决方案:
```python
import time
import random
import win32gui
import win32con
# 微信窗口的类名和窗口名
WX_CLASS = "WeChatMainWndForPC"
WX_TITLE = "微信"
# 笑话文件的路径和发送间隔(秒)
JOKE_FILE = "D:\\笑话合集.TXT"
SEND_INTERVAL = 20 * 60
# 要发送笑话的好友和发送次数
FRIEND_NAME = "某某"
SEND_COUNT = 3
# 笑话列表和当前发送的笑话索引
jokes = []
joke_index = 0
# 读取笑话文件
with open(JOKE_FILE, "r", encoding="utf-8") as f:
joke = ""
for line in f:
if line.strip() == "":
jokes.append(joke)
joke = ""
else:
joke += line
if joke != "":
jokes.append(joke)
# 获取微信窗口句柄
hwnd = win32gui.FindWindow(WX_CLASS, WX_TITLE)
# 发送笑话的函数
def send_joke():
global joke_index
if joke_index >= len(jokes):
joke_index = 0
joke = jokes[joke_index]
joke_index += 1
win32gui.SendMessage(hwnd, win32con.WM_SETTEXT, 0, FRIEND_NAME)
time.sleep(1)
win32gui.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
time.sleep(1)
win32gui.SendMessage(hwnd, win32con.WM_SETTEXT, 0, joke)
time.sleep(1)
win32gui.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
print("发送笑话:", joke)
# 循环发送笑话
send_count = 0
last_send_time = time.time()
while send_count < SEND_COUNT:
# 检查是否收到停止发送的消息
if win32gui.FindWindowEx(hwnd, 0, "Edit", None) != 0:
last_msg = win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, 1024, 0)
if last_msg in ["有病", "傻", "有毛病啊"]:
print("收到停止发送的消息:", last_msg)
break
elif last_msg in ["看过了", "没意思"]:
send_joke()
last_send_time = time.time()
continue
# 检查是否到达发送间隔
if time.time() - last_send_time >= SEND_INTERVAL:
send_joke()
send_count += 1
last_send_time = time.time()
# 随机等待一段时间
time.sleep(random.randint(1, 10))
```
这个程序使用了 `win32gui` 和 `win32con` 模块来控制微信窗口,可以实现自动发送笑话的功能。具体实现过程如下:
1. 读取笑话文件,将每个笑话存储在一个列表中。
2. 获取微信窗口的句柄。
3. 定义一个发送笑话的函数,该函数会向指定的好友发送一个笑话,并更新当前发送的笑话索引。
4. 循环发送笑话,直到达到指定的发送次数或收到停止发送的消息。
5. 在每次循环中,先检查是否收到停止发送的消息,如果是则退出循环;否则检查是否到达发送间隔,如果是则调用发送笑话的函数并更新最后发送时间。
6. 在每次循环中,随机等待一段时间,以避免被微信识别为机器人。
注意,这个程序只是一个示例,实际使用时需要根据具体情况进行修改和调试。另外,自动发送消息可能会违反微信的使用协议,使用时需要自行承担风险。
阅读全文