Python创建类时错误? 类型错误:类无参数

本文分享了一位Python初学者在面向对象编程中遇到的一个常见错误:构造函数定义错误导致类实例化失败。通过纠正构造函数的下划线符号,成功解决了问题,并实现了对学生GPA的计算。
部署运行你感兴趣的模型镜像

前言

Python是我第一门接触到的面向对象的语言,很久前学过Pyhton的基础语法,和大多数人一样,学了基础过后了解了很多方向,学过一点基于requests的爬虫,也了解过基于pygame的游戏开发相关知识,也了解过python的numpy科学计算库。到现在也有一段时间了,也差不多都忘了,感觉还是个小白。现在想回来继续python的面向对象学习,不曾想一来就犯了这么低级的错误。。。

从面向过程到面向对象,其实也好理解,感觉类似于在写头文件并实现接口的过程就是创建类,实现的接口函数可以说方法。但是总感觉有点不习惯。。。刚接触面向对象,还得深入学啊TAT

Python创建类实例

代码很简单,就是构造了一个类,然后构造了一些对类中成员的操作方法。老手可能一眼就已经发现我的错误在哪了。。。对照视频学习的时候看着代码也是一样的啊。。我的咋就跑不起来呢。。甚至一度怀疑是我的idle抽风了(其实是我抽了。。。)下面是我错误的代码

class StudentGPA:
	def _init_(self,name,num,allcredits,points):
		self.name = name;
		self.num = num;
		self.credits = float(allcredits);
		self.points = float(points);

	def getName(self):
		return self.name,self.num;

	def getCredits(self):
		return self.credits;

	def getPoint(self):
		return self.points;

	def GPA(self):
		return self.points / self.credits;

def makeStudent(infoStr):
	#infoStr为文件中的一行内容,创建一个学生对象,返回StudentGPA对象
	name,num,allcredits,points = infoStr.split("\t");
	return StudentGPA(name,num,allcredits,points);

#输入读入数据的文本文件名,以读方式打开
filename = input("Enter name the grade file:");
fp = open(filename,"r");

#从文件中读入一行,创建第一个学生对象
best = makeStudent(fp.readline());

 #计算GPA最高,best对象存放GPA最高的学生
for line in fp: 
	s = makeStudent(line);
	if s.GPA() > best.GPA(): 
		best = s;
  
#关闭文件
fp.close();

print("成绩最好的学生是:", best.getName());
print("学分:",best.getCredits()); 
print("GPA:",best.GPA());

Python创建类时发生错误

程序一跑,提示错误,TypeError:StudentGPA() takes no arguments?
我的类没有参数??

Enter name the grade file:students.txt
Traceback (most recent call last):
  File "/Users/liuxin/Desktop/Python/面向对象/StudentGPA.py", line 30, in <module>
    best = makeStudent(fp.readline());
  File "/Users/liuxin/Desktop/Python/面向对象/StudentGPA.py", line 23, in makeStudent
    return StudentGPA(name,num,allcredits,points);
TypeError: StudentGPA() takes no arguments

错误类型优快云一下

终于发现错误了。。就是下面这一行:

def _init_(self,name,num,allcredits,points):

左右少下划线。。。
正确代码:

def __init__(self,name,num,allcredits,points):

然后就可以正确运行了!

Enter name the grade file:students.txt
成绩最好的学生是: ('Llllx', '5601117150')
学分: 101.0
GPA: 0.04455445544554455

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>嗯,用户想了解如何在Python创建和实例化对象。根据用户提供的引用内容,我需要综合这些信息来给出一个清晰的回答。首先,我应该回顾一下用户之前的问题和我的回答,确保这次回答的一致性。 用户之前的问题是关于Python基础的,包括数据类型、控制结构、函数、错误处理和文件操作。现在他们转向了面向对象编程,特别是和对象的创建。我需要确保回答结构清晰,分步骤说明,并且提供代码示例。 首先,从引用[1]和[2]中可以看到,的基本结构包括属性、方法和构造函数。比如,class Person和Dog的例子,里面展示了如何定义,使用__init__方法初始化属性,以及定义实例方法。引用[3]提到了方法和如何修改属性,引用[4]涉及继承和重写,引用[5]讨论了实例化后的内存问题。这些内容可能需要整合到回答的同部分,但用户当前的问题集中在创建和实例化对象的基础,所以可能需要深入方法或继承,但可以简要提及作为扩展。 用户的问题明确指出要创建和对象,所以步骤应该包括定义、构造函数、实例属性、实例方法,然后实例化对象并调用方法。需要确保每个步骤都有代码示例,并且解释清楚各部分的作用,比如self参数,__init__的作用,以及实例化的过程。 需要注意的是,用户提供的引用中有一些例子可能包含旧式(如Person(object)中的object在Python3中是可选的),需要指出在Python3中默认继承object,所以可以省略。同,在实例化,比如J1=Person(),需要说明构造函数的参数是否必要,如果有__init__方法是否需要传递参数,比如在引用[5]中的Play需要传递player参数。 可能存在的误区是用户可能混淆属性和实例属性,或者在构造函数中如何正确初始化属性。需要明确区分属性(如species在Dog中)和实例属性(如name和age)。同,在实例方法中,self的重要性需要强调,以确保用户理解方法是怎样绑定到实例的。 另外,用户可能在调用方法遇到问题,比如忘记加括号,或者没有正确传递参数。代码示例中的调用方式需要正确展示,比如J1.play()。 最后,相关问题部分需要根据用户可能进一步的问题来设计,比如与实例的区别,构造函数的作用,属性的修改,以及继承等。这些问题应该引导用户深入理解面向对象编程的其他方面。</think>### Python创建与实例化方法详解 以下是创建及实例化对象的完整流程,结合代码示例说明各步骤的实现逻辑: #### 一、的定义 使用 `class` 关键字定义,推荐采用大驼峰命名法(如 `ClassName`) **基础结构**: ```python class : # 属性(可选) 属性名 = 初始值 # 初始化方法(构造函数) def __init__(self, 参数列表): # 实例属性初始化 self.实例属性名 = 参数值 # 实例方法 def 方法名(self, 参数列表): 方法体 ``` #### 二、实例化对象 通过 `名(构造参数)` 创建实例对象,自动调用 `__init__` 方法: ```python 对象名 = 名(参数列表) ``` #### 三、完整示例演示 ```python class Student: school = "清华大学" # 属性(所有实例共享) def __init__(self, name, age): self.name = name # 实例属性(每个对象独立) self.age = age # 实例属性 def study(self, course): print(f"{self.name} 正在学习 {course}") # 实例化对象 stu1 = Student("张三", 20) stu2 = Student("李四", 19) # 调用方法 stu1.study("Python程序设计") # 输出:张三 正在学习 Python程序设计 stu2.study("高等数学") # 输出:李四 正在学习 高等数学 # 访问属性 print(stu1.school) # 输出:清华大学(访问属性) print(stu2.age) # 输出:19(访问实例属性) ``` --- ### 关键概念解析 1. **属性 vs 实例属性** - 属性通过直接访问,所有实例共享(如 `Student.school`) - 实例属性通过 `self` 定义,每个对象独立存储(如 `name`) 2. **`__init__` 方法** - 必须包含 `self` 参数 - 用于初始化对象状态 - 实例化自动调用,需要手动触发[^1][^2] 3. **`self` 参数的特殊性** - 表示当前对象实例 - 所有实例方法必须包含该参数(位置固定为第一个参数) - 调用方法无需显式传递 `self`(Python 自动处理) --- ### 进阶操作示例 #### 动态修改属性 ```python class MobilePhone: def __init__(self, brand): self.brand = brand iphone = MobilePhone("Apple") print(iphone.brand) # 输出:Apple # 修改实例属性 iphone.brand = "iPhone 15" print(iphone.brand) # 输出:iPhone 15 # 动态添加新属性 iphone.color = "深空灰" print(iphone.color) # 输出:深空灰 ``` #### 继承示例 ```python class Animal: def __init__(self, name): self.name = name def speak(self): raise NotImplementedError("子必须实现此方法") class Dog(Animal): def speak(self): return "汪汪!" class Cat(Animal): def speak(self): return "喵~" mydog = Dog("阿黄") print(mydog.speak()) # 输出:汪汪! ``` --- ### 常见误区提醒 1. **忘记 `self` 参数** 错误示例: ```python def method(参数): # 缺少 self 参数 pass ``` 2. **错误调用初始化方法** 错误做法: ```python obj.__init__() # 需要手动调用 ``` 3. **混淆属性与实例属性** 错误理解: ```python class Test: shared_list = [] # 属性(所有实例共享) def add_item(self, item): self.shared_list.append(item) # 实际操作的是属性 ``` --- ### 扩展应用场景 1. **数据封装**:创建自定义数据类型(如坐标点 `Point`) 2. **GUI 开发**:定义窗口组件(如按钮 `Button`) 3. **游戏开发**:构建游戏角色(如 `Player`、`Enemy` ) 4. **Web 框架**:Django 的模型定义 --- ### 相关问题 1. 如何理解 Python 的 `self` 参数与 Java/C++ 的 `this` 指针区别? 2. 方法与静态方法的使用场景有哪些同? 3. 如何通过元(metaclass)实现自定义创建逻辑? 4. 多重继承的方法解析顺序(MRO)是怎样的?
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值