python-OOP(83)

#基础
# 为玩具厂创建一个玩具熊类。
# 玩具熊有名字、尺寸、颜色这些数据属性;还有唱歌、说话的行为。

# __init__在实例化时自动执行,实例本身自动作为第一个参数传递给self
# self只是习惯用的名字,不是必须使用

class BearToy:
    def __init__(self,nm,color,size):
        self.name = nm
        self.color = color
        self.size = size

    def sing(self):
        print('lalala...')

    def speak(self):
        print('my name is %s' % self.name)

if __name__ == '__main__':
    tidy = BearToy('Tidy','white','Large')  #调用__init__
    print(tidy.color)
    print(tidy.size)
    tidy.sing()
    tidy.speak()



#组合
# 如果两个类有本质不同,其中一类的对象是另一个类对象的组件时,使用组合是最佳方案。
# 玩具熊还有生产厂商的信息,生产厂商的信息可以作为玩具熊的一个属性。

class Vendor:
    def __init__(self,phone,email):
        self.phone = phone
        self.email = email

    def call(self):
        print('calling %s' % self.phone)

class BearToy:
    def __init__(self,color,size,phone,email):
        self.color = color
        self.size = size
        self.Vendor = Vendor(phone,email)

if __name__ == '__main__':
    bigbear = BearToy('Brown','Middle','400-111-8989','[email protected]')
    print(bigbear.color)
    bigbear.Vendor.call()





#继承
# 如果两个类有很多相同之处,使用继承更为合理。
# 新品玩具熊增加了一个跑的行为,其他与原来的玩具熊一致

class BearToy:
    def __init__(self,nm,color,size):
        self.name = nm
        self.color = color
        self.size = size

    def sing(self):
        print('lalala...')

    def speak(self):
        print('my name is %s' % self.name)

class NewBear(BearToy): #BearToy是父类,NewBear是子类
    def run(self):
        print('running...')

if __name__ == '__main__':
    b1 = NewBear('venie','Brown','small')
    b1.sing()
    b1.run()








#子类调用父类方法
# 如果子类和父类具有同名的方法,那么父类方法将被遮盖住。
# 可以在子类中明确指明调用的是父类方法,而不是子类的同名方法。

class BearToy:
    def __init__(self,nm,color,size):
        self.name = nm
        self.color = color
        self.size = size

    def sing(self):
        print('lalala...')

    def speak(self):
        print('my name is %s' % self.name)

class NewBear(BearToy):
    def __init__(self,nm,color,size,date):
        super(NewBear, self).__init__(nm,color,size)
        self.date = date

    def run(self):
        print('runing...')

if __name__ == '__main__':
    b1 = NewBear('venie','Brown','Small','2018-07-20')
    b1.sing()
    b1.run()





#magic
class Book:
    def __init__(self,title,author,pages):
        self.title = title
        self.author = author
        self.pages = pages

    def __str__(self):
        return '《%s》' % self.title

    def __call__(self):
        print('《%s》 is writen by %s' % (self.title,self.author))

if __name__ == '__main__':
    py_book = Book('Core Python','Wesley',800)  #调用__init__方法
    print(py_book)  #调用__str__
    py_book()   #调用__call__






#多重继承
# 类的父类(基类)可以有很多个,子类可以调用所有父类的方法。
# 如果有重名方法,生效的顺序是自下而上,自左而右。当然最好不要出现重名方法

class A:
    def foo(self):
        print('in A foo')
    def hello(self):
        print('A hello')

class B:
    def bar(self):
        print('in B bar')
    def hello(self):
        print('B hello')

class C(B,A):
    pass
    #def hello(self):
    #   print('C hello')
if __name__ == '__main__':
    c = C()
    c.foo()
    c.bar()
    c.hello()






#类方法和静态方法
#通过Date创建实例,也可以通过Date.create创建实例

class Date:
    def __init__(self,year,month,date):
        self.year = year
        self.month = month
        self.date = date

    @classmethod    #类方法,不用创建实例即可调用
    def create(cls,dstr):   #cls表示类的本身,是class的缩写
        y,m,d = map(int,dstr.split('-')) #map(int,['2000','5','4'])
        dt = cls(y,m,d)
        return dt

    @staticmethod   #静态方法,写在类外面,可以独立成为一个函数,却把它放到了类中
    def is_date_valid(dstr):
        y,m,d = map(int,dstr.split('-'))
        return 1 <= d <= 31 and 1 <= 12 and y < 4000

if __name__ == '__main__':
    bith_date = Date(1995,12,3)
    print(Date.is_date_valid('2000-5-4'))
    day = Date.create('2000-5-4')
    print(day)



# white
# Large
# lalala...
# my name is Tidy
# Brown
# calling 400-111-8989
# lalala...
# running...
# lalala...
# runing...
# 《Core Python》
# 《Core Python》 is writen by Wesley
# in A foo
# in B bar
# B hello
# True
# <__main__.Date object at 0x7f404e141f98>




你可能感兴趣的:(python)