第6章 习题

1

源码

#创建一个名为Thing的空类并将它打印出来。接着,创建一个属于该类的对象example,
#同样将它打印出来

class Thing():
	pass

print('This is a class: ', Thing)

thing = Thing()
print('This is an object: ', thing)

结果

This is a class:  <class '__main__.Thing'>
This is an object:  <__main__.Thing object at 0x0000015355CC5390>

2

#创建一个新的类,叫作Thing2,将'abc'赋值给类特性letters,打印letters。
class Thing2:
	letters = 'abc'
	
print(Thing2.letters)

结果:

abc

3

3.1

#再重建一个新的类,叫作Thing3。这次将'xyz'赋值给实例(对象)特性letters,并试着打印			letters。
#看看你是不是必须先创建对象才能进行打印操作?
class Thing3:
	letters = 'abc'
	
print('print directly: ', Thing3.letters)

thing3 = Thing3()
thing3.letters = 'xyz'
print('print indirectly: ', thing3.letters)

结果:

print directly:  abc
print indirectly:  xyz

3.2 参考答案

class Thing3:
	def __init__(self):
		self.letters = 'xyz'
	
#变量letters属于Thing3的任何对象,而不是Thing3类本身

print(Things.letters)
	#"AttributeError:type object 'Thing3' has no attribute 	'letters'

something = Things3()
print(somethins.letters)
	#"打印出’xyz' "	

3.3 要点

变量self.letters中的letters为“实例特性”,属于Thing3的任何对象,而不是Thing3类本身。

4

4.1

#创建一个名为Element的类,它包含实例特性name,symbol,和number。
#使用Hydrogen,H和1实例化一个对象。
class Element:
	def __init__(self, name, symbol, number):
		self.name = name
		self.symbol = symbol
		self.number = number

element = Element('Hydrogen', 'H', 1)
print(element.name,  element.symbol, element.number)

4.2 要点

类的定义不用带参数列表;
使用参数实例化对象时,参数有三种:数字,字符/字符串,变量名。

5

5.1

#创建一个字典,包含这些键值对:'name': 'Hydrogen', 'symbol': 'H' 和'number': 1。
#然后用这个字典实例化Element类的对象hydrogen
class Element:
	def __init__(self, name, symbol, number):#对象属性
			self.name = name
			self.symbol = symbol
			self.number = number
		
el_dict = {'name': 'Hydrogen', 'symbol': 'H', 'number': 1}

hydrogen = Element(el_dict['name'],el_dict['symbol'],el_dict['number'])

print(hydrogen.name, hydrogen.symbol, hydrogen.number)

5.2 要点

注意区分位置参数与关键字参数

6

6.1

#Element类定义一个dump()方法,用于打印对象的属性(name, symbol, number)。
#使用这个新类创建一个对象hydrogen并用dump()打印
class Element:
	def __init__(self, name, symbol, number):
		self.name = name
		self.symbol = symbol
		self.number = number
	def dump(self):
		print(self.name, self.symbol, self.number)

el_dict = {'name': 'Hydrogen', 'symbol': 'H', 'number': 1}
hydrogen = Element(**el_dict)	#以关键字的形式传递参数
hydrogen.dump()

6.2 要点

以关键字的形式传递参数时注意在字典的变量名前加" ** ";
实例调用方法时注意加括号。

7

7.1

#调用print(hydrogen),然后修改Element的定义,将dump方法的名字改为__str__。
#再次创建hydrogen对象并调用print(hydrogen),观察输出结果

class Element:
	def __init__(self, name, symbol, number):
		self.name = name
		self.symbol = symbol
		self.number = number
		def __str__(self):
		return 'name:%s, symbol=%s, number=%s' % (self.name, self.symbol, 	self.number)
		
el_dict = {'name': 'Hydrogen', 'symbol': 'H', 'number': 1}

hydrogen = Element(**el_dict)	#以关键字的形式实例化对象

print(hydrogen)

结果:

name:Hydrogen, symbol=H, number=1

7.2 要点

__str__只能返回一个字符串,而不能返回一个元组;
dump(self)改为__str(self)__需要将print()改为return

8

8.1

#修改Element使得name, symbol和number特性都变为私有的。为它们各定义
#一个getter属性(property)来返回各自的值。
class Element:
	def __init__(self, name, symbol, number):
		self.__name = name
		self.__symbol = symbol
		self.__number = number
	@property
	def name(self):
		return self.__name
	@property
	def symbol(self):
		return self.__symbol
	@property
	def number(self):
		return self.__number

el_dict = {'name': 'Hydrogen', 'symbol': 'H', 'number': 1}
hydrogen = Element(**el_dict)
hydrogen.name

8.2 要点

不增加@property则无法引用name方法。

9

9.1

#定义一个生成器函数get_odds():返回0~9内的奇数。使用for循环查找并输出
#返回的第三个值。
def get_odds():
	for num in range(0,10):
		if num % 2  == 1:
			yield num

for cout, num in enumerate(get_odds(), 1):
	if cout == 3:
		print('The third num is: ', num)
		i += 1

9.2 要点

enumerate()函数用法:
enumerate(squencer, [start=0]),squence为可迭代对象,[start=0]为默认计数起始值

10

10.1

#定义一个装饰器test:当一个函数被调用时输出'start',当函数结束时输出'end'。
def test(func):
	def new_func(*args, **kwargs):
		print('start')
		result = func(*args, **kwargs)
		print('end')
		return result
	return new_func

@test
def helloworld():
	print('Hello World : I\'m a decorator')

helloworld()

要点

注意new_func()参数列表(*args, **kwargs)中的*args用于收集位置参数,**kwargs用于收集关键字参数

猜你喜欢

转载自blog.csdn.net/Hollybobo79/article/details/83786784
今日推荐