1、自定义学生类Student, 成员包含:实例属性sno、sname、age,类属性count; 实例方法:show()用于显示sno、sname 、age的信息;类方法 classAddCount()实现count属性加1;静态 方法staticShowcount()显示当前count 值。要求属性全部为私有,
时间: 2024-02-23 11:00:26 浏览: 86
好的,以下是代码实现:
```python
class Student:
__count = 0 # 私有类属性
def __init__(self, sno, sname, age):
self.__sno = sno # 私有实例属性
self.__sname = sname
self.__age = age
Student.__count += 1
def show(self):
print("学号:{},姓名:{},年龄:{}".format(self.__sno, self.__sname, self.__age))
@classmethod
def classAddCount(cls):
cls.__count += 1
@staticmethod
def staticShowcount():
print("当前count值为:{}".format(Student.__count))
```
这样,我们就定义了一个名为 `Student` 的类,其中包含了要求的实例属性和类属性,以及实例方法、类方法、静态方法。其中,实例属性全部为私有,只能通过内部方法访问和修改。
相关问题
用python自定义学生类Student, 成员包含:实例属性sno、sname、age,类属性count; 实例方法:show()用于显示sno、sname 、age的信息;类方法 classAddCount()实现count属性加1;静态 方法staticShowcount()显示当前count 值。要求属性全部为私有,完成下列问 颢• (1) 创建两个Student对象,分别 访问上述成员方法,同时用类名访问 上述成员方法,并输出结果。 (2)为Student对象动态增加新成员性别sex和方法setGrade()获取学生年级,导入types模块,调用 MethodType () 方法。 (3) 在类外部访问sno私有实例 厲性 (4) 请在类中提供get()方法返回age的值,以及set()方法设置age的新值。新age>0时,允许设置为新值,新age<=0时,提示设置年龄不合法。
好的,我来为你解答。
```python
import types
class Student:
count = 0
def __init__(self, sno, sname, age):
self.__sno = sno
self.__sname = sname
self.__age = age
Student.count += 1
def show(self):
print("学号:{0},姓名:{1},年龄:{2}".format(self.__sno, self.__sname, self.__age))
@classmethod
def classAddCount(cls):
cls.count += 1
@staticmethod
def staticShowcount():
print("当前count值为:", Student.count)
def setGrade(self, grade):
self.__grade = grade
def get(self):
return self.__age
def set(self, age):
if age > 0:
self.__age = age
else:
print("设置年龄不合法!")
# 创建两个Student对象
stu1 = Student("1001", "张三", 18)
stu2 = Student("1002", "李四", 20)
# 访问实例方法
stu1.show()
stu2.show()
# 用类名访问实例方法
Student.show(stu1)
Student.show(stu2)
# 访问类方法
Student.classAddCount()
# 访问静态方法
Student.staticShowcount()
# 动态增加新成员sex和方法setGrade()
stu1.sex = "男"
stu1.setGrade = types.MethodType(lambda self, grade: setattr(self, "__grade", grade), stu1)
stu1.setGrade("大一")
print(stu1.sex)
print(stu1.__grade)
# 访问私有实例属性sno
print(stu1._Student__sno)
# 访问set()方法
stu1.set(25)
print("修改后的年龄为:", stu1.get())
stu1.set(-1)
```
输出结果如下:
```
学号:1001,姓名:张三,年龄:18
学号:1002,姓名:李四,年龄:20
学号:1001,姓名:张三,年龄:18
学号:1002,姓名:李四,年龄:20
当前count值为: 3
男
大一
1001
修改后的年龄为: 25
设置年龄不合法!
```
实例方法: show ()用于显示 sno 、 sname 、 age 的信息;类方法 classAddCount ()实现 count 属性加1;静态方法 staticShowCount ()显示当前 count 值。要求属性全部为私有,并完成下列问题: (1)创建两个 Student 对象,分别访问上述成员方法,同时用类名访问上述成员方法,并输出结果。 (2)为 Student 对象动态增加新成员性别 sex 和方法 setGrade ()获取学生年级,导入 types 模块,调用 MethodType ()方法。 (3)在类外部访问 sno 私有实例属性 (4) 我们知道,若在类外部通过对象尝试修改 age 值是允许的,但是直接修改属性值可能带来一些问题。例如,可能直接设置成不合法的值,如 age =-10。所以,为了避免客户端直接修改属性的问题,请在类中提供 get ()方法返回 age 的值,以及 set ()方法设置 age 的新值。新 age >0时,允许设置为新值,新 age <=0时,提示设置年龄不合法。
好的,根据你的需求,我可以为你编写一个 `Student` 类,实现上述功能。以下是代码:
```python
import types
class Student:
__count = 0 # 私有类属性,记录学生数量
def __init__(self, sno, sname, age):
self.__sno = sno # 私有实例属性,学号
self.__sname = sname # 私有实例属性,姓名
self.__age = age # 私有实例属性,年龄
self.__sex = '' # 私有实例属性,性别
def show(self):
print(f"学号:{self.__sno},姓名:{self.__sname},年龄:{self.__age}")
@classmethod
def classAddCount(cls):
cls.__count += 1
@staticmethod
def staticShowCount():
print(f"当前学生数量为:{Student.__count}")
def setGrade(self, grade):
self.__grade = grade
def getAge(self):
return self.__age
def setAge(self, age):
if age <= 0:
print("设置年龄不合法")
else:
self.__age = age
# 创建两个 Student 对象
s1 = Student("20191001", "张三", 18)
s2 = Student("20191002", "李四", 19)
# 调用实例方法 show()
s1.show()
s2.show()
# 通过类名调用类方法 classAddCount()
Student.classAddCount()
# 通过类名调用静态方法 staticShowCount()
Student.staticShowCount()
# 为对象动态增加新成员性别 sex 和方法 setGrade()
s1.__sex = '男'
s1.setGrade = types.MethodType(lambda self, grade: setattr(self, '_Student__grade', grade), s1)
s1.setGrade(1)
print(s1.__dict__)
# 在类外部访问 sno 私有实例属性
# print(s1.__sno) # 会抛出 AttributeError 异常
print(s1._Student__sno)
# 在类外部尝试修改 age 私有实例属性
# s1.__age = 20 # 不会修改属性值
s1._Student__age = 20 # 修改属性值
print(s1.getAge()) # 输出 age 的值
# 使用 setAge() 方法修改 age 的值
s1.setAge(-10)
s1.setAge(21)
print(s1.getAge()) # 输出 age 的值
```
在上面的代码中,我们定义了一个 `Student` 类,并实现了 `show()` 方法、`classAddCount()` 类方法、`staticShowCount()` 静态方法、`setGrade()` 动态方法、`getAge()` 和 `setAge()` 方法。
我们首先创建了两个 `Student` 对象 `s1` 和 `s2`,并分别调用了实例方法 `show()` 来显示学生信息。
然后我们通过类名调用了类方法 `classAddCount()`,并通过类名调用静态方法 `staticShowCount()` 显示当前学生数量。
接着我们通过 `types` 模块的 `MethodType()` 方法为 `s1` 对象动态增加了新成员 `sex` 和方法 `setGrade()`。
然后我们尝试在类外部访问 `sno` 私有实例属性,由于该属性是私有的,所以不能直接访问,需要使用 `_Student__sno` 的方式来访问。
接着我们在类外部尝试修改 `age` 私有实例属性,由于该属性是私有的,直接修改属性值是不允许的,需要通过 `getAge()` 和 `setAge()` 方法来获取和设置属性值。
最后我们输出 `s1` 对象的信息,包括所有实例属性和方法。
阅读全文
相关推荐








