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