python 类的各类设计、子类扩展、变化及继承,边学边练,边练边记录。
print("=============类的设计=======================")
class Employee:
def __init__(self,name,salary=0):
self.name = name
self.salary =salary
def giveRaise(self,percent):
self.salary = self.salary + (self.salary*percent)
def work(self):
print(self.name,"does stuff")
def __repr__(self):
return "<Employee:name=%s,salary=%s>"%(self.name,self.salary)
class Chef(Employee):
def __init__(self,name):
Employee.__init__(self,name,50000)
def work(self):
print(self.name,"makes food")
class Server(Employee):
def __init__(self,name):
Employee.__init__(self,name,40000)
def work(self):
print(self.name,"interfaces with customer")
class PizzaRobot(Chef):
def __init__(self,name):
Chef.__init__(self,name)
def work(self):
print(self.name,"makes pizza")
if __name__ == '__main__':
bob = PizzaRobot('bob')
print(bob)
bob.work()
bob.giveRaise(0.20)
print(bob);print()
for klass in Employee,Chef,Server,PizzaRobot:
obj = klass(klass.__name__)
obj.work()
class Customer:
def __init__(self,name):
self.name=name
def order(self,server):
print(self.name,"orders from",server)
def pay(self,server):
print(self.name,"pays for item to",server)
class Oven:
def bake(self):
print("oven bakes")
class PizzaShop:
def __init__(self):
self.server = Server('Pat')
self.chef =PizzaRobot('Bob')
self.oven = Oven()
def order(self,name):
customer = Customer(name)
customer.order(self.server)
self.chef.work()
self.oven.bake()
customer.pay(self.server)
if __name__ == '__main__':
scene = PizzaShop()
scene.order('Homer')
print('...')
scene.order('Shaggy')
print("=============重返流处理器=======================")
# def processor(reader,converter,writer):
# while 1:
# data = reader.read()
# if not data: break
# data = converter(data)
# writer.write(data)
#
# class Processor:
# def __init__(self,reader,writer):
# self.reader = reader
# self.wrtier = writer
# def process(self):
# while 1:
# data = self.reader.readline()
# if not data: break
# data =self.converter(data)
# self.wrtier.write(data)
# def converter(self,data):
# assert False,'converter must be defined'
#
# class Uppercase(Processor):
# def converter(self,data):
# return data.upper()
# if __name__ == '__main__':
# import sys
# obj = Uppercase(open('spam.txt'),sys.stdout)
# obj.process()
print("============类的高级主题===================")
class Set:
def __init__(self,value=[]):
self.data = []
self.contat(value)
def intersect(self,other):
res = []
for x in other:
res.append(x)
return Set(res)
def union(self,other):
res = self.data[:]
for x in other:
if not x in res:
res.append(x)
return Set(res)
def contat(self,value):
for x in value:
if not x in self.data:
self.data.append(x)
def __len__(self): return len(self.data)
def __getitem__(self, key): return self.data[key]
def __and__(self, other): return self.intersect(other)
def __or__(self, other): return self.union(other)
def __repr__(self): return 'Set:' + repr(self.data)
x=Set([1,3,5,7])
print(x.union(Set([1,4,7])))
print(x | Set([1,4,6]))
print("============通过子类扩展类型===================")
# class Mylist(list):
# def __getitem__(self, offset):
# print('(indexing %s at %s)' % (self,offset))
# return list.__getitem__(self,offset - 1)
#
# if __name__ == '__main__':
# print(list('abc'))
# x=Mylist('abc')
# print(x)
#
# print(x[1])
# print(x[3])
#
# x.append('spam');print(x)
# x.reverse();print(x)
print("============新式类变化===================")
"""
1、类和类型合并
类现在就是类型,并且类型现在就是类。实际上,这二者基本上是同义词。type(I)内置函数返回一个实例所创建自的类,而不是一个通用的实例类型,并
且,通常是和I. class相同的。此外,类是type类的实例,type可能子类化为定制类创建,并且所有的类(以及由此所有的类型)继承自object
2、继承搜索顺序
多继承的钻石模式有一种略微不同的搜索顺序,总体而言,它们可能先横向搜索再纵向搜索,并且先宽度优先搜索,再深度优先搜索。
3、针对内置函数的属性获取
getattr_和_getattribute_方法不再针对内置运算的隐式属性获取而运行。这意味着,它们不再针对运算符重载方法名而调用,这样的名称搜索从类开
始,而不是从实例开始。
4、新的高级工具
新式类有一组新的类工具,包括slot、特性、描述符和 getattribute方法。这
些工具中的大多数都有非常特定的工具构建目的。
"""
# class C:pass
# I=C()
# type(I)
# I.__class__
# type([1,2,3])
# type(list)
# list.__class__
print("============所有对象派生自object===================")
class C:pass
X=C()
type(X)
type(C)
isinstance(X,object)
isinstance(C,object)
type('spam')
type(str)
isinstance('spam',object)
isinstance(str,object)
type(type)
type(object)
isinstance(type,object)
isinstance(object,type)
print("============钻石继承变动===================")
class A:
attr = 1
class B(A):
pass
class C(A):
attr = 2
class D(B,C):
pass
x=D()
print(x.attr)
class A(object):
attr = 1
class B(A):
pass
class C(A):
attr = 2
class D(B,C):
pass
x=D()
print(x.attr)
print("============下阶段学:异常与工具===================")
版权声明:本文为hahahehe2020原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。