# 任何时候,子类都可以换掉父类对象,李氏原则
# Python 没有从语言层面支持抽象类的概念
# 我们可以通过adc模块来制造抽象类的效果
# 在定义类的时候通过指定metaclass=ABCMeta可以将声明为抽象类
# 抽象类是不能创建对象的 抽象类存在的意义是专门拿给其他类继承
# abc模块中还有一个包装器abstradctmethod
# 通过这个包装器可以将方法包装器为抽象方法 必须要求子类进行重写
from abc import ABCMeta,abstractmethod ## 检查有没把抽象方法写出代码 ,没写就会报错不能执行
class Employee(object ,metaclass=ABCMeta):
'''员工'''
def __init__(self,name):
# 初始化
self._name = name
@property
def name(self):
return self._name
@abstractmethod
def get_salary(self): # 得到工资
# 获得月薪
pass
class Manager(Employee):
def get_salary(self):
return 15000.0
class Programmer(Employee):
def __init__(self,name, working_hour=0):
super().__init__(name)
self._working_hour = working_hour
@property
def working_hour(self):
return self._working_hour
@working_hour.setter
def working_(self,working_hour):
self._working_hour = working_hour\
if working_hour > 0 else 0
def get_salary(self):
return 150.0 * self._working_hour
class Salesman(Employee):
def __init__(self,name,sales=0):
super().__init__(name)
self.__sales = sales
@property
def sale(self):
return self.__sales
@sale.setter
def sales(self,sales):
self._sales = sales if sales > 0 else 0
def get_salary(self):
return 1200.0 + self._sales * 0.05
##结算月薪
def main():
emps =[
Manager('刘备'),Programmer('诸葛亮'),
Manager('曹操'),Salesman('苟劲'),
Salesman('吕布') ,Programmer('张辽'),
Programmer('赵云')
]
for emp in emps:
if isinstance(emp,Programmer): #判断是不是这个类型,判断类型
emp.working_hour = int(input('请输入%s本月工作时间:'% emp.name))
elif isinstance(emp,Salesman): #识别对象类型
emp.sales = float(input('请输入%s本月销售额:'% emp.name))
# 同样的接收get_salaey 这个消息 但是不同的员工表现出了不同的行为
# 因为三个子类都重写了get_salary 方法 所以这个方法会表现出多态行为
print('%s本月工资:¥%.2f元'% (emp.name,emp.get_salary()))
if __name__ == '__main__':
main()
提款机
# 银行取款机
class Bank(object):
def __init__(self,*,card_no,owner,balance=0): # 账号 余额 存款 转账
self._card_no = card_no
self._balance = balance
self._owner = owner
@property
def banlance(self):
return self._balance
def deposit(self,money): # 存钱
if money > 0 :
self._balance += money
return True
return False
def withdraw(self,money):
if 0 < money <= self._balance:
self._balance -= money
return True
return False
def transfer(self,other,money):
if self .withdraw(money):
other.deposit(money)
return True
return False
def main():
account = Account('11123344','王大锤')
print(account.balance)
account.deposit(2000)
account.withdraw(500)
print(account.balance)
if account.withdraw(5000):
print(account.balance)
else:
print('余额不足')
account2 = Account(card_no='22334455',owner ='李大嘴',balance =120)
if account.transfer(account2,800):
print(account.balance)
print(account2.balance)
else :
print('余额不足')
if __name__ == '__main__':
main()
随机扑克
## 扑克
# Spade .Heart .Club. Diamond
# 洗牌 随机打乱
# home :提前把pygame 建好 21点游戏写出来 写一个类,要计算加减乘除
from random import randrange
class Card(object):
"""一张牌"""
def __init__(self,suite,face):
self._suite =suite
self._face = face
@property
def face(self):
return self._face ## 花色
@property
def suite(self):
return self._suite ##点数
def __str__(self):
if self._face == 1:
face_str = 'A'
elif self._face == 11:
face_str = 'J'
elif self._face == 12:
face_str = 'Q'
elif self._face == 13:
face_str = 'K'
else:
face_str = str(self._face)
return '%s%s' %(self._suite,face_str)
class Poker(object):
"""一副牌"""
def __init__(self):
self._cards = []
for suit in '♠♥♦♣':
for face in range(1,14):
card = Card(suit, face)
self._cards.append(card)
@property
def cards(self):
return self._cards
def shuffle(self):
"""洗牌"""
self._current = 0
cards_len = len(self._cards)
for index in range(cards_len): # 前闭区间,后开区间 # randrange 和range 区别 查一下
pos = randrange(cards_len)
self._cards[index],self._cards[pos] = \
self._cards[pos],self._cards[index]
@property
def next(self): # 发牌
card = self._cards[self._current]
self._current += 1
return card
@property # 包装成属性
def has_next(self):
"""还有没牌发,返回True代表还有牌可发"""
return self._current < len(self._cards) # 看看还有没有牌可以发
class Player(object):
"""初始化玩家"""
def __init__(self,name):
self._name = name
self._cards_on_hand = []
@property
def name(self):
return self._name
@property
def cards_on_hand(self):
return self._cards_on_hand
def get(self,card):
"""摸牌"""
self._cards_on_hand.append(card)
def arrange(self):
"""排序"""
self._cards_on_hand.sort(key= get_face)
def get_face(card):
return card.face # 通过这个函数可以拿到每个牌点数,传到上面
def main():
p = Poker()
p.shuffle()
players = [Player('东邪'),Player('西毒'),Player('南帝'),Player('北丐')]
for _ in range(13):
for player in players:
player.get(p.next)
for player in players:
print(player.name + ':',end = ' ')
player.arrange()
for card in player.cards_on_hand:
print(card,end=' ')
print()
if __name__ == '__main__':
main()
用面向对象写 给出三条边,算面积、周长
from math import sqrt
class Triangle(object):
def __init__(self,a,b,c):
self._a = a
self._b =b
self._c = c
# @classmethod
@staticmethod # 发给类的对象,静态方法
def is_valid(a,b,c): # 这个方法没有对象,不是发个对象的消息,发上面的类的
# print(cls)
# print(type(cls))
return a + b > c and b+ c > a and a + c > b
@property
def perimeter(self):
return self._a + self._b + self._c
@property
def area(self):
half = self.perimeter / 2
return sqrt(half*(half - self._a)*
(half - self._b)*(half - self._c))
def main():
a =b =c =1
if Triangle.is_valid(a,b,c):
t = Triangle(a,b,c)
print(t.perimeter) # print(Triangle.perimeter(t)
print(t.area) # print(Triangle.are(t))
# 上面两种写法一样的效果
else:
print('无法构成三角形')
if __name__ == '__main__':
main()