派生内置
定义一个新类型的元组,对于传入的可迭代对象,我们只保留int类型且值大于0的元素。
python中有内置的元组类型,tuple类型。自己也可以自定义一个方法类型,
class IntTuple(tuple):
# # 重写父类的构造方法
# def __init__(self,iterable):
# # iterable里面的元素 为整数且>0的值
# for i in iterable:
# if isinstance(i,int) and i >0: # 遍历对象
# super().__init__()
# # print(self)
# '''
# 说明 元组对象 在__init__构造方法之前 就已经创建完成了,所以没有实现
# '''
# int_tuple = IntTuple([-2,2,"hh",["x","y","z"],4])
# # print(int_tuple) # (-2, 2, 'hh', ['x', 'y', 'z'], 4)
#
创建的方法并没有实现,主要原因的_init__方法。
# class Demo(object):
# def __new__(cls, *args, **kwargs):
# print("__new__") # 创建对象
# # return super().__new__(cls) # 返回出对象 __new__ __init__
# return object.__new__(cls) # 返回出对象 __new__ __init__
#
# def __init__(self):
# print("__init__")
# '''
# 加上return 后 就会将两个对象一起打印,若没有就只打印new
# '''
# # d = Demo() # __new__
# d = Demo.__new__(Demo) # 创建对象
# Demo.__init__(d) # __new__ __init__ 初始化
如上述代码所示,在__new__方法来创建对象的时候,返回的的是new,init方法并没有打印出来,需要return才能打印出来,是方法重现。
- __new__方法是创建对象的方法
此处重写了父类的方法
需调用父类的__new__方法来创建对象
需将对象返回回来给__init__方法,没有__new__方法,则会调用基类方法。 - __init__方法为初始化方法
注意:当创建完对象时,自动调用它。
# li = list.__new__(list,"abc")
# # print(li) # []
# list.__init__(li,"abc")
# print(li) # ['a', 'b', 'c']
# tu = tuple.__new__(tuple,"123")
# print(tu) # ('1', '2', '3')
# tuple.__init__(tu,"123")
# print(tu) # ('1', '2', '3')
元组和列表在创建时的区别。
class IntTuple(tuple):
def __new__(cls, iterable):
f = [i for i in iterable if isinstance(i,int) and i >0]
return super().__new__(cls,f)
int_tuple = IntTuple([2,-3,"hh",["a","b"],4])
print(int_tuple) # (2, 4)
当使用new方法来重写自定义方法时,就可以实现该方法。
列表推导式:
li = []
for i in range(10):
print(i)
# li.append(i)
if i%2 == 0:
li.append(i)
# print(li)
# print([i for i in range(10)])
# print([i for i in range(10) if i%2 ==0])
# 嵌套
print([(i,j) for i in range(10) for j in range(10)])
for i in range(10):
for j in range(10):
print(i,j)