请根据注释将以下代码中的"<X>"替换为适当的内容:
<X> rectangle( ): #创建类:矩形
sn=0 #类属性:实例数目
def <X>(self,width,height):
self.width=width #矩形宽
self.height=height #矩形高
<X> #实例数增1
def <X>(self):
<X> #实例数减1
p=[0]*4
p[0]=<X>(6,7) #创建实例
p[1]=<X>(3,4) #创建实例
p[2]=<X>(8,5) #创建实例
s=input("输入矩形顺序号(0,1或2):")
try:
s=int(s)
assert 0<=s<3
w=<X> #得到矩形的宽
h=<X> #得到矩形的高
<X> #删除实例
print(f"删除的矩形宽={w},高={h}")
#显示实例数目
print(f"num=<X>")
except:print("failed!")
要求:
1、函数和程序保存到:s11t1.py。
2、运行程序,理解程序执行效果。
【参考与提示】
1、创建类的实例时会自动执行构造函数。
2、删除类的实例时会自动执行析构函数。
3、创建类的实例后,可通过类名或对象名引用类属性。
class rectangle( ): # 创建类:矩形
sn = 0 # 类属性:记录当前存在的矩形实例总数
def __init__(self, width, height): # 构造函数
self.width = width # 实例属性:矩形宽度
self.height = height # 实例属性:矩形高度
rectangle.sn += 1 # 每创建一个新实例,类属性sn自增1
def __del__(self): # 析构函数
rectangle.sn -= 1 # 每删除一个实例,类属性sn自减1
p = [0] * 4
p[0] = rectangle(6,7) # 创建宽6高7的实例
p[1] = rectangle(3,4) # 创建第二个实例
p[2] = rectangle(8,5) # 创建第三个实例
s = input("输入矩形顺序号(0,1或2):")
try:
s = int(s)
assert 0 <= s < 3
w = p[s].width # 获取选中矩形的宽度属性
h = p[s].height # 获取选中矩形的高度属性
del p[s] # 删除实例(触发__del__方法)
print(f"删除的矩形宽={w},高={h}") # 输出被删矩形的尺寸
print(f"num={rectangle.sn}") # 输出当前实例数量
except: # 异常处理
print("failed!")
任务2 类的应用_对象属性与类属性
请根据注释将以下代码中的"<X>"替换为适当的内容:
class dog( ):
<X>=0 #类属性zs并赋值
def __init__(self):
<X>="" #定义对象属性pm
<X>="" #定义对象属性ck
s=input("输入pm,ck:")
try:
s=s.split(",")
d=dog()
<X>=s[0] #为d属性pm赋值
<X>=s[1] #为d属性ck赋值
<X>="pp" #为d定义属性xh
<X>=1 #定义类属性sn并赋值
print("ok")
except:print("no")
要求:
1、函数和程序保存到:s11t1.py
2、运行程序,理解程序执行效果。
【参考与提示】
1、类的定义内外均可创建类和对象属性。
2、在类的定义外创建的对象属性只属于该对象。
class dog( ):
zs = 0 # 类属性zs:定义所有狗共有的特征
def __init__(self):
self.pm = "" # 实例属性:品种pm
self.ck = "" # 实例属性:产地ck
s = input("输入 pm,ck:")
try:
s = s.split(",")
d = dog( ) # 创建dog类的实例
d.pm = s[0] # 给实例的pm属性赋值(品种)
d.ck = s[1] # 给实例的ck属性赋值(产地)
d.xh = "pp" # 动态添加实例属性:型号(非类定义属性)
dog.sn = 1 # 动态添加类属性:序列号(所有实例共享)
print("ok") # 操作成功提示
except:
print("no")
任务3 类的应用_对象方法与类方法
创建一个单词类:WordsCount
要求:
1、定义对象属性words:字符串,创建实例时即赋值。
2、定义类方法get_num(cls,numstr),将整数串转换为整数,实数串转换为浮点数,其他串转换为0。
3、定义对象方法count,用于统计words属性字符串各字符出现的频率。
4、程序运行时先根据输入的字符串创建类的实例并输出各字符的出现频率,再将输入的数值串转换为数值输出。
5、函数和程序保存到:s11t3.py
6、程序执行效果:
输入字符串:abcbcc
统计结果:[('a',1),('b',2),('c',3)]
输入数值字符串:23.0
转换结果:23.0->23
【参考与提示】
1、类的定义中,使用@classmethod装饰器的方法为类方法。
2、类的定义中,未使用装饰器的方法为对象方法。
class WordsCount:
def __init__(self, words):
self.words = words
@classmethod
def get_num(cls, numstr): # 类方法(首个参数cls,指向类本身)
try:
num = float(numstr)
return int(num) if num.is_integer( ) else num
except ValueError:
return 0
def count(self): # 对象方法(首个参数self,指向对象本身)
char_order = [ ]
frequency = { }
for char in self.words:
if char not in frequency:
char_order.append(char)
frequency[char] = 1
else:
frequency[char] += 1
return [(char, frequency[char]) for char in char_order]
s1 = input("输入字符串:")
wc = WordsCount(s1)
print("统计结果:", wc.count( )) # 对象方法通过实例调用
s2 = input("输入数值字符串:")
result = WordsCount.get_num(s2) #类方法通过类调用,也可由对象调用
print(f"转换结果:{s2}->{result}")
任务4 类的应用_静态方法
创建类:Analyze
要求:
1、定义静态方法count(a)返回a(为列表或元组)的数值个数及均值(取整)。忽略a的非数值元素。
2、程序运行时输入一个包含若干数值的字符串,调用上面定义的静态方法count(a)输出a的数值个数及均值。
3、程序保存到:s11t4.py
4、程序执行效果:
输入数值串:67,90,85,ab,73,87,cd,98
num=6,avg=83
【参考与提示】
1、类的定义中,使用@staticmethod装饰器的方法为静态方法。
2、可以通过“类名.静态方法名”的形式调用类的静态方法。
class Analyze:
@staticmethod
def count(a):
"""静态方法:使用 @staticmethod 装饰器,无需self或cls参数,直接通过类名调用
参数a:列表或元组,包含需要处理的元素
返回值:元组(有效数值个数, 平均值)"""
valid_numbers = [ ]
for item in a:
try:
num = float(item)
valid_numbers.append(num)
except ValueError:
continue
num_count = len(valid_numbers)
if num_count == 0:
avg = 0
else:
avg = int(sum(valid_numbers) / num_count)
return num_count, avg
s = input("输入数值串:")
t = s.split( ',' )
num, avg = Analyze.count( t ) #静态方法可直接由类调用,也可由对象调用
print(f"num={num},avg={avg}")
任务5 类的应用_私有属性与私有方法
创建类:Prime
要求:
1、定义类的私有属性primes,用于存储100以内的质数。
2、定义静态私有方法getprimes,创建类实例时调用该方法完成类属性primes赋值。
3、定义静态公有方法isprime(m),利用m是否为类的私有属性primes的元素来判断m是否为质数。
4、程序运行时输入一个[1,100]上的正整数m,调用上面定义的方法isprime输出m是否为质数("YES"或"NO")。输入无效数据时输出"ERROR"。
5、程序保存到:s11t5.py
6、程序执行效果:
输入一个[1,100]上的正整数:59
59是否为质数:YES
【参考与提示】
1、类的定义中,使用@staticmethod装饰器的方法为静态方法。
2、以双下划线开头命名的属性(或方法)为私有属性(或方法),否则为公有属性(或方法)。
3、私有属性(或方法)只能在类的其他方法中调用,外部不能调用。
class Prime:
__primes = [ ] # 定义私有类属性,用于存储100以内的所有质数
@staticmethod
def __getprimes( ):
"""静态私有方法,用于生成100以内的质数列表
返回:包含100以内所有质数的列表"""
primes = [ ]
for num in range(2, 101):
is_prime = True
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
primes.append(num)
return primes
@staticmethod
def isprime(m):
"""静态公有方法,判断给定的数是否为质数
参数:m - 待判断的正整数
返回:如果m是质数返回True,否则返回False"""
# 如果类属性__primes为空,则调用私有方法__getprimes进行初始化
if not Prime.__primes:
Prime.__primes = Prime.__getprimes( ) #私有类属性调用私有方法
return m in Prime.__primes
try:
m = int(input("输入一个[1,100]上的正整数:"))
if 1 <= m <= 100:
result = Prime.isprime(m) # 调用静态公有方法判断是否为质数
print(f"{m}是否为质数:{'YES' if result else 'NO'}")
else:
print("ERROR")
except ValueError:
print("ERROR")

