self.getattr实现了什么
时间: 2024-06-03 17:08:24 浏览: 90
self.getattr()方法是Python中的内置函数,用于获取对象的属性值。它接受两个参数,第一个参数是对象本身,第二个参数是属性名。如果属性名存在于对象中,该方法就会返回对应的属性值;如果属性不存在,该方法会抛出AttributeError异常。
通过使用self.getattr()方法,我们可以在运行时动态地获取一个对象的属性值,这在某些情况下非常有用,例如在实现类似ORM(对象关系映射)的框架中,需要根据用户输入的条件动态地查询数据库中的数据。
相关问题
class firstpage: def init(self,screen): self.screen = screen self.font = pygame.font.Font("D:\Virtual stdio2022\华文行楷.ttf", 36) self.button1 = self.font.render("登录/注册", True, BLACK) self.button1_rect=self.button1.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2+100)) def draw(self): pygame.display.blit(background,(0,0)) pygame.draw.rect(self.screen, GRAY, self.button1_rect) self.screen.blit(self.button1, self.button1_rect) def handle_event(self, event): if event.type == pygame.MOUSEBUTTONDOWN: if self.button1_rect.collidepoint(event.pos): return register(self.screen) return self class register: def init(self,screen): 续写并优化上述代码,实现一个运行后有背景图片和登录、注册按钮的窗口,点击登录按钮出现登录界面,将输入的用户名和密码与保存用户名和密码的文件进行比对,如果没有就显示用户名或密码错误请重新输入,如果文件之中有该用户名和密码,则登录成功并跳转至开始界面,点击注册按钮,用户输入用户名和密码,如果该用户名与文件中的用户名相同,则提示用户重新设置用户名,如果没有,则将该用户名和密码写入文件,并显示注册成功,并跳转至登录界面。
好的,我来续写并优化代码:
```python
import pygame
# 定义常量
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
BLACK = (0, 0, 0)
GRAY = (128, 128, 128)
# 初始化 Pygame
pygame.init()
# 创建窗口
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 加载背景图片
background = pygame.image.load("background.png")
class FirstPage:
def __init__(self, screen):
self.screen = screen
self.font = pygame.font.Font("D:\Virtual stdio2022\华文行楷.ttf", 36)
self.button1 = self.font.render("登录", True, BLACK)
self.button1_rect = self.button1.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2+50))
self.button2 = self.font.render("注册", True, BLACK)
self.button2_rect = self.button2.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2+150))
def draw(self):
self.screen.blit(background, (0, 0))
pygame.draw.rect(self.screen, GRAY, self.button1_rect)
self.screen.blit(self.button1, self.button1_rect)
pygame.draw.rect(self.screen, GRAY, self.button2_rect)
self.screen.blit(self.button2, self.button2_rect)
def handle_event(self, event):
if event.type == pygame.MOUSEBUTTONDOWN:
if self.button1_rect.collidepoint(event.pos):
return Login(self.screen)
elif self.button2_rect.collidepoint(event.pos):
return Register(self.screen)
return self
class Login:
def __init__(self, screen):
self.screen = screen
self.font = pygame.font.Font("D:\Virtual stdio2022\华文行楷.ttf", 36)
self.username = ""
self.password = ""
self.input_rects = [
pygame.Rect(SCREEN_WIDTH/2-150, SCREEN_HEIGHT/2-50, 300, 50),
pygame.Rect(SCREEN_WIDTH/2-150, SCREEN_HEIGHT/2+50, 300, 50)
]
self.input_texts = [
self.font.render("用户名:", True, BLACK),
self.font.render("密码:", True, BLACK)
]
self.input_texts_rects = [
self.input_texts[0].get_rect(topleft=(SCREEN_WIDTH/2-150, SCREEN_HEIGHT/2-80)),
self.input_texts[1].get_rect(topleft=(SCREEN_WIDTH/2-150, SCREEN_HEIGHT/2+20))
]
self.login_button = self.font.render("登录", True, BLACK)
self.login_button_rect = self.login_button.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2+150))
def draw(self):
self.screen.blit(background, (0, 0))
for rect in self.input_rects:
pygame.draw.rect(self.screen, GRAY, rect)
for i in range(len(self.input_texts)):
self.screen.blit(self.input_texts[i], self.input_texts_rects[i])
self.screen.blit(self.login_button, self.login_button_rect)
for i in range(len(self.input_texts)):
text_surface = self.font.render(getattr(self, 'input'+str(i+1)), True, BLACK)
self.screen.blit(text_surface, self.input_rects[i].move(5, 5))
def handle_event(self, event):
if event.type == pygame.MOUSEBUTTONDOWN:
if self.login_button_rect.collidepoint(event.pos):
with open("users.txt", "r") as f:
for line in f:
username, password = line.strip().split(",")
if username == self.username and password == self.password:
return StartPage(self.screen)
self.username = ""
self.password = ""
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_BACKSPACE:
setattr(self, 'input'+str(self.input_rects.index(event.dict['unicode'])+1), getattr(self, 'input'+str(self.input_rects.index(event.dict['unicode'])+1))[:-1])
else:
setattr(self, 'input'+str(self.input_rects.index(event.dict['unicode'])+1), getattr(self, 'input'+str(self.input_rects.index(event.dict['unicode'])+1))+event.dict['unicode'])
return self
class Register:
def __init__(self, screen):
self.screen = screen
self.font = pygame.font.Font("D:\Virtual stdio2022\华文行楷.ttf", 36)
self.username = ""
self.password = ""
self.input_rects = [
pygame.Rect(SCREEN_WIDTH/2-150, SCREEN_HEIGHT/2-50, 300, 50),
pygame.Rect(SCREEN_WIDTH/2-150, SCREEN_HEIGHT/2+50, 300, 50)
]
self.input_texts = [
self.font.render("用户名:", True, BLACK),
self.font.render("密码:", True, BLACK)
]
self.input_texts_rects = [
self.input_texts[0].get_rect(topleft=(SCREEN_WIDTH/2-150, SCREEN_HEIGHT/2-80)),
self.input_texts[1].get_rect(topleft=(SCREEN_WIDTH/2-150, SCREEN_HEIGHT/2+20))
]
self.register_button = self.font.render("注册", True, BLACK)
self.register_button_rect = self.register_button.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2+150))
def draw(self):
self.screen.blit(background, (0, 0))
for rect in self.input_rects:
pygame.draw.rect(self.screen, GRAY, rect)
for i in range(len(self.input_texts)):
self.screen.blit(self.input_texts[i], self.input_texts_rects[i])
self.screen.blit(self.register_button, self.register_button_rect)
for i in range(len(self.input_texts)):
text_surface = self.font.render(getattr(self, 'input'+str(i+1)), True, BLACK)
self.screen.blit(text_surface, self.input_rects[i].move(5, 5))
def handle_event(self, event):
if event.type == pygame.MOUSEBUTTONDOWN:
if self.register_button_rect.collidepoint(event.pos):
with open("users.txt", "r") as f:
for line in f:
username, password = line.strip().split(",")
if username == self.username:
self.username = ""
self.password = ""
return self
with open("users.txt", "a") as f:
f.write(self.username+","+self.password+"\n")
return FirstPage(self.screen)
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_BACKSPACE:
setattr(self, 'input'+str(self.input_rects.index(event.dict['unicode'])+1), getattr(self, 'input'+str(self.input_rects.index(event.dict['unicode'])+1))[:-1])
else:
setattr(self, 'input'+str(self.input_rects.index(event.dict['unicode'])+1), getattr(self, 'input'+str(self.input_rects.index(event.dict['unicode'])+1))+event.dict['unicode'])
return self
class StartPage:
def __init__(self, screen):
self.screen = screen
self.font = pygame.font.Font("D:\Virtual stdio2022\华文行楷.ttf", 36)
self.title = self.font.render("欢迎来到开始界面!", True, BLACK)
def draw(self):
self.screen.blit(background, (0, 0))
self.screen.blit(self.title, (SCREEN_WIDTH/2-self.title.get_width()/2, SCREEN_HEIGHT/2))
def handle_event(self, event):
if event.type == pygame.MOUSEBUTTONDOWN:
return self
return self
# 初始界面
current_page = FirstPage(screen)
# 游戏循环
while True:
# 处理游戏事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
current_page = current_page.handle_event(event)
# 绘制游戏界面
current_page.draw()
# 更新游戏界面
pygame.display.update()
```
这是一个完整的 Pygame 程序,包含四个页面:初始界面 `FirstPage`、登录界面 `Login`、注册界面 `Register` 和开始界面 `StartPage`。程序运行后,首先显示初始界面,用户可以选择登录或注册。当用户点击登录按钮时,进入登录界面,用户可以输入用户名和密码,如果输入的用户名和密码与保存在文件中的一致,则登录成功并跳转至开始界面;否则提示用户重新输入。当用户点击注册按钮时,进入注册界面,用户可以输入用户名和密码,如果输入的用户名已存在,则提示用户重新设置用户名;否则将该用户名和密码写入文件,并显示注册成功,并跳转至登录界面。在开始界面,显示欢迎界面,用户可以点击任意位置返回开始界面。
class CellTrack_Model(nn.Module): def __init__(self, hand_NodeEncoder_dic={}, learned_NodeEncoder_dic={}, intialize_EdgeEncoder_dic={}, message_passing={}, edge_classifier_dic={} ): super(CellTrack_Model, self).__init__() self.distance = CosineSimilarity() self.handcrafted_node_embedding = MLP(**hand_NodeEncoder_dic) self.learned_node_embedding = MLP(**learned_NodeEncoder_dic) self.learned_edge_embedding = MLP(**intialize_EdgeEncoder_dic) edge_mpnn_class = getattr(edge_mpnn, message_passing.target) self.message_passing = edge_mpnn_class(**message_passing.kwargs) self.edge_classifier = MLP(**edge_classifier_dic) def forward(self, x, edge_index, edge_feat): x1, x2 = x x_init = torch.cat((x1, x2), dim=-1) src, trg = edge_index similarity1 = self.distance(x_init[src], x_init[trg]) abs_init = torch.abs(x_init[src] - x_init[trg]) x1 = self.handcrafted_node_embedding(x1) x2 = self.learned_node_embedding(x2) x = torch.cat((x1, x2), dim=-1) src, trg = edge_index similarity2 = self.distance(x[src], x[trg]) edge_feat_in = torch.cat((abs_init, similarity1[:, None], x[src], x[trg], torch.abs(x[src] - x[trg]), similarity2[:, None]), dim=-1) edge_init_features = self.learned_edge_embedding(edge_feat_in) edge_feat_mp = self.message_passing(x, edge_index, edge_init_features) pred = self.edge_classifier(edge_feat_mp).squeeze() return pred
这段代码定义了一个名为 `CellTrack_Model` 的神经网络模型,该模型用于细胞轨迹跟踪任务。
在 `__init__` 方法中,模型的各个组件和参数被定义:
- `hand_NodeEncoder_dic`、`learned_NodeEncoder_dic`、`intialize_EdgeEncoder_dic`、`message_passing` 和 `edge_classifier_dic` 分别表示手工设计的节点编码器、学习得到的节点编码器、初始化的边编码器、消息传递参数和边分类器的参数字典。
在 `forward` 方法中,定义了模型的前向传播过程:
1. 首先对输入的节点特征 x 进行拆分,得到 x1 和 x2。然后将它们拼接成一个新的输入 x_init。
2. 计算 x_init 中源节点和目标节点之间的相似度 similarity1,以及它们的绝对差值 abs_init。
3. 分别通过手工设计的节点编码器和学习得到的节点编码器对 x1 和 x2 进行编码。
4. 将编码后的节点特征拼接成新的节点特征 x,并计算 x 中源节点和目标节点之间的相似度 similarity2。
5. 根据源节点和目标节点的特征,以及相似度和差值等特征,拼接成输入边特征 edge_feat_in。
6. 使用初始化的边编码器对输入边特征进行编码得到 edge_init_features。
7. 使用消息传递过程(message_passing)对节点特征和边特征进行传递和更新。
8. 将更新后的边特征通过边分类器进行预测,得到预测结果 pred。
9. 返回预测结果 pred。
这段代码实现了一个用于细胞轨迹跟踪的神经网络模型。通过对输入的节点特征进行编码和传递,最终预测边的标签。
阅读全文