2020-2-7(111)

#继承

class Contact:
    all_contacts = []
    
    def __init__(self,name,email):
        self.name = name
        self.email = email
        Contact.all_contacts.append(self)

class Supplier(Contact):
    def order(self,order):
        print("%s order to %s" %(order,self.name))

#代码调试

C:\Users\39621>python -i d:\2019\py1.py
>>> s1=Supplier("cc","123@qq.com")
>>> s1.order("rrr")
rrr order to cc
>>> s1.all_contacts
[<__main__.Contact object at 0x00000289E019AFC8>, <__main__.Supplier object at 0x00000289E019E1C8>]
>>> c1.all_contacts
[<__main__.Contact object at 0x00000289E019AFC8>, <__main__.Supplier object at 0x00000289E019E1C8>]
>>> Contact.all_contacts
[<__main__.Contact object at 0x00000289E019AFC8>, <__main__.Supplier object at 0x00000289E019E1C8>]
>>> Supplier.all_contacts
[<__main__.Contact object at 0x00000289E019AFC8>, <__main__.Supplier object at 0x00000289E019E1C8>]
class ContactList(list):
    def search(self,name):
        matching_contacts = []
        for contact in self:
            if name in contact.name:
                matching_contacts.append(contact)
        return matching_contacts

class Contact:
    all_contacts = ContactList()
    
    def __init__(self,name,email):
        self.name = name
        self.email = email
        Contact.all_contacts.append(self)

#代码调试

C:\Users\39621>python -i d:\2019\py1.py
>>> c1=Contact("cc","123@qq.com")
>>> c2=Contact("zz","1234@qq.com")
>>> c3=Contact("bb","12345@qq.com")
>>> Contact.all_contacts
[<__main__.Contact object at 0x000002767FF5E108>, <__main__.Contact object at 0x000002767FF5E208>, <__main__.Contact object at 0x000002767FF5E308>]
>>> Contact.all_contacts.search("cc")
[<__main__.Contact object at 0x000002767FF5E108>]
>>> Contact.all_contacts.search("cczz")
[]
class LongNameDict(dict):
    def longest_key(self):
        longest = None
        for key in self:
            if not longest or len(key) > len(longest):
                longest = key
        return longest
#代码调试

C:\Users\39621>python -i d:\2019\py1.py
>>> d=LongNameDict()
>>> d
{}
>>> d["cc"]=18
>>> d
{'cc': 18}
>>> d["zz"]=20
>>> d
{'cc': 18, 'zz': 20}
>>> d.items()
dict_items([('cc', 18), ('zz', 20)])
>>> d.longest_key()
'cc'
>>> d["cbb"]=30
>>> d
{'cc': 18, 'zz': 20, 'cbb': 30}
>>> d.longest_key()
'cbb'    

#重写

class Contact:
    all_contacts = []
    
    def __init__(self,name,email):
        self.name = name
        self.email = email
        Contact.all_contacts.append(self)
        
class Friend(Contact):
    def __init__(self,name,email,phone):
        Contact.__init__(self,name,email)
        self.phone = phone

#多重继承

class MailSender:
    def send_mail(self,message):
        print("Sending mail to " + self.name)
        print("Sending content: " + message)
        
class EmailableContact(Contact,MailSender):
    pass
class Contact:
    all_contacts = []
    
    def __init__(self,name,email):
        self.name = name
        self.email = email
        Contact.all_contacts.append(self)
             
class AddressHolder:
    def __init__(self,street,city,state,code):
        self.street = street
        self.city = city
        self.state = state
        self.code = code
    
class Friend(Contact,AddressHolder):
    def __init__(self,name,email,phone,street,city,state,code):
        Contact.__init__(self,name,email)
        AddressHolder.__init__(self,street,city,state,code)
        self.phone = phone

#钻石继承的问题
#BaseClass的call_me方法被调用了两次。

class BaseClass:
    num_base_calls = 0
    def call_me(self):
        print("Base Class")
        BaseClass.num_base_calls += 1
        
class LeftSubclass(BaseClass):
    num_left_calls = 0
    def call_me(self):
        BaseClass.call_me(self)
        print("Left Class")
        LeftSubclass.num_left_calls += 1
        
class RightSubclass(BaseClass):
    num_right_calls = 0
    def call_me(self):
        BaseClass.call_me(self)
        print("Right Class")
        RightSubclass.num_right_calls += 1
        
class Subclass(LeftSubclass,RightSubclass):
    num_sub_calls = 0
    def call_me(self):
        LeftSubclass.call_me(self)
        RightSubclass.call_me(self)
        print("Sub Class")
        Subclass.num_sub_calls += 1

#改为super().call_me()调用一次BaseClass.call_me()

class BaseClass:
    num_base_calls = 0
    def call_me(self):
        print("Base Class")
        BaseClass.num_base_calls += 1
        
class LeftSubclass(BaseClass):
    num_left_calls = 0
    def call_me(self):
        super().call_me()
        print("Left Class")
        LeftSubclass.num_left_calls += 1
        
class RightSubclass(BaseClass):
    num_right_calls = 0
    def call_me(self):
        super().call_me()
        print("Right Class")
        RightSubclass.num_right_calls += 1
        
class Subclass(LeftSubclass,RightSubclass):
    num_sub_calls = 0
    def call_me(self):
        super().call_me()
        print("Sub Class")
        Subclass.num_sub_calls += 1
        
s=Subclass()
s.call_me()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值