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
用于收集关键字参数