1.改进房子家具类的代码
class House:
def __init__(self, name, total_area):
self.name = name
self.total_area = total_area
self.item_list = []
self.free_area = self.total_area
def __str__(self):
# items = ', '.join([item.name for item in self.item_list])
# return f'户型为{self.name},总面积为{self.total_area},剩余面积为{self.free_area},家具名称列表为{items}'
return f'户型为{self.name},总面积为{self.total_area},剩余面积为{self.free_area},家具名称列表为{self.item_list}'
def add_item(self, item):
if self.free_area > item.area:
# self.item_list.append(item)
self.item_list.append(item.name)
self.free_area -= item.area
class HouseItem:
"""家具类"""
def __init__(self, name, area):
self.name = name
self.area = area
def __str__(self):
return f'家具为{self.name},占地面积为{self.area}'
bed = HouseItem('bed',4)
chest = HouseItem('chest',2)
table = HouseItem('table',1.5)
my_house = House('三室一厅',8)
my_house.add_item(bed)
my_house.add_item(chest)
my_house.add_item(table)
print(my_house)
# print(dir(my_house))
后期:一个页面定义一个类
class LoginPage:
def __init__(self,username,password,code):
self.username = username
self.password = password
self.code = code
self.button = '登录'
def login(self):
print(f'{self.username}登陆成功')
usr = LoginPage('ww','123456','123')
usr.login()
class Person:
def __init__(self, name,age):
self.name = name
# 私有的本质 是python解释器执行代码 发现属性名或者方法名前面有两个_ 会将这个名字重命名
# 将其加上_类名的前缀
# self.__age ==> self._Person__age
self.__age = age #将其定义为私有属性
def __str__(self): # 在类内部可以访问私有属性
return f'{self.name},{self.__age}'
xm = Person('小明',18)
print(xm)
# print(xm.__age) # 在类的外部不能直接使用私有属性
print(xm.__dict__)
# {'name': '小明', '_Person__age': 18}
xm.__age = 20 # 这个不是修改私有属性 是添加了一个公有的属性 __age
print(xm)
print(xm.__dict__)
# {'name': '小明', '_Person__age': 18, '__age': 20}
print(xm._Person__age)
xm._Person__age = 19
print(xm)
print(xm.__dict__)
# {'name': '小明', '_Person__age': 19, '__age': 20}
真正去修改私有属性 放在共有方法里面:
封装:定义类的过程
继承:相同代码不重复
注意是共有的属性和方法
python支持多继承 但不经常用
class Animal:
def eat(self):
print('eat')
class Dog(Animal):
def bar(self):
print('bar')
class XTQ(Dog):
pass
ani = Animal()
ani.eat()
dog = Dog()
dog.eat()
dog.bar()
x = XTQ()
x.eat()
x.bar()
class Dog:
def bark(self):
print('bbbbbb')
class XTQ(Dog):
def bark(self):
print('aaaaaa')
xtq = XTQ()
xtq.bark()
Dog().bark()
class Dog:
def bark(self):
print('bbbbbb')
class XTQ(Dog):
def bark(self):
super().bark() #先调用父类方法
print('aaaaaa')
xtq = XTQ()
xtq.bark()
Dog().bark()
super() 也是一个类 继承object
多态:
class Person:
def work(self):
print('人在工作')
class Test(Person):
def work(self):
print('测试')
class Code(Person):
def work(self):
print('开发')
class Company:
def show_work(self,worker):
worker.work()
p = Person()
t = Test()
c = Code()
cc = Company()
cc.show_work(t)
cc.show_work(c)
cc.show_work(p)
属性和方法
Python一切皆对象
即 使有class定义的类 也是一个对象
对象的划分:实例对象(实例) 类对象(类)
创建出来的 对象 叫做类的实例
属性的划分:
实例属性 概念 是实例对象 具有的属性
类属性 概念 是类对象 具有的属性
需要同时变化的是 类属性 共有的 可以定义为类属性
class Dog:
count = 0 #统计类的对象数
def __init__(self,name):
self.name = name
# 每创建一个对象 就会调用init方法
Dog.count +=1
print(Dog.count)
Dog('qq')
dog = Dog('ww')
dog2 = dog # no
dog3 = Dog # no
print(Dog.count) # 2
print(dog.count) # 2
dog4 = Dog('aa')
print(dog.count) # 3
类属性同一变化
实例方法: 对象.方法名()
优化 使用类方法(整体) 静态方法
import random
class Game:
top_score = 0
def __init__(self,name):
self.name = name
@staticmethod
def show_help():
print('这是游戏的帮助信息')
@classmethod
def show_top_score(cls):
print(f'游戏最高分为{Game.top_score}')
def start_game(self):
num = random.randint(10,100)
if num>Game.top_score:
Game.top_score = num
print(f'{self.name}本次得分为{num}')
xw = Game('小王')
xw.start_game()
Game.show_top_score()
xw.start_game()
Game.show_top_score()
Game.show_help()