1、类和对象
类有类名、属性和方法
1.1 类的定义和对象创建
## 定义类,类的三要素,类名,类属性,类方法
class Cat: ## 此处不执行,只定义,类名为Cat
## 属性 即变量,在外面定义,也可以使用__init__方法接收实参
## 初始化对象,__init__(self)方法,默认自动调用
def __init__(self,name,age):
self.name = name
self.age = age
## 可以直接调用对象,必须有return,如使用print(tom)调用
def __str__(self):
return "str测试 %s 的年龄是%d"%(self.name,self.age)
## 方法
def eat(self):
print("猫在吃鱼 ....")
def drink(self):
print("猫在喝水 ....")
## self的功能,用作接收对象
def introduce(self):
# print('%s 的年龄是%d'%(tom.name,tom.age))
print('%s 的年龄是%d'%(self.name,self.age))
## 创建对象
# tom = Cat() ## 执行Cat(),返回对象的引用,使用tom指向该引用
tom = Cat("汤姆",40)
print(tom)
## 调用tom指向对象中的方法
tom.eat()
tom.drink()
## 给tom指向的对象添加两个属性
# tom.name = '汤姆'
# tom.age = 40
# 调用属性,self的使用
# print('%s 的年龄是%d'%(tom.name,tom.age))
tom.introduce() ## 相当于 tom.introduce(tom)
## 总结
lanmao =Cat("蓝猫",10) ## class Cat + def __init__
print(lanmao) ## def __str__
lanmao.eat() ## def eat
lanmao.drink() ## def drink
lanmao.introduce() ## def introduce
2、类的案例
2.1 给房子加入家具,对应减少可用面积
## 类的案例:给房子加入家具,对应减少可用面积
class Home:
def __init__(self,new_area,new_info,new_address):
self.area = new_area
self.info = new_info
self.address = new_address
self.left_area = new_area
self.container_item = []
def __str__(self):
msg = "房子面积:%d平米,可用面积:%d,户型信息:%s ,房子地址:%s"%(self.area,self.left_area,self.info,self.address)
msg += "包含家具:%s"%(str(self.container_item))
return msg
def add_jiaju(self,item):
# self.left_area -= item.area
# self.container_item.append(item.name) ## 注意:能直接获取变量值的,都应该改为函数调用,应为item可能不会返回给你值
self.left_area -= item.get_area()
self.container_item.append(item.get_name())
class JIAJU:
def __init__(self,new_name,new_area):
self.name = new_name
self.area = new_area
def __str__(self):
return "家具:%s,占用面积:%d 平米"%(self.name,self.area)
def get_area(self):
return self.area
def get_name(self):
return self.name ## 我自己可以决定是否返回,控制权限
## 实例化房子fangzi
fangzi = Home(120,"三室一厅","上海市浦东新区金桥镇")
## 实例化席梦思ximengsi
ximengsi = JIAJU("席梦思",4)
## 房子加入家具-席梦思
fangzi.add_jiaju(ximengsi)
print(fangzi)
## 房子加入家具-冰箱
bingxiang = JIAJU("冰箱",1)
fangzi.add_jiaju(bingxiang)
print(fangzi)
3、隐藏属性(私有属性)
3.1 用函数对变量的控制
class Dog:
def set_age(self,new_age):
if new_age >= 0 and new_age <= 100:
self.age = new_age
else :
self.age = 0
def get_age(self):
return self.age
dog = Dog()
dog.set_age(-1)
age = dog.get_age()
print(age)
4、私有方法
class Msg:
## 私有方法
def __send_msg(self): ## __开头的自定义方法,叫私有方法,类以外的函数不能调用
print("--------短信发送中------")
## 公有方法
def send_msg(self,new_money):
if new_money >= 10000:
self.__send_msg() ## 满足条件时,内部调用私有方法
else:
print("余额不足,请充值")
msg = Msg()
msg.send_msg(13330)
5、类的继承和重写
class Animal: ## 定义类
def __init__(self):
self.name='zhangsan'
self.__age=40
def __info(self): ## 私有方法
print(self.name)
print(self.__age)
def info(self): ## 公有方法
print(self.name)
print(self.__age)
def eat(self):
print("------吃------")
def drink(self):
print("------喝------")
def sleep(self):
print("------睡------")
def run(self):
print("------跑------")
class Dog(Animal): ## 定义子类,继承Animal
def wangwang(self):
print("-----汪汪汪------")
class Xiaotq(Dog): ## 继承Dog类
def fly(self):
print("-------飞-----")
def wangwang(self): ## 重写方法,不使用父类的方法
print("-----狂吠------")
## 调用父类方法1
# Dog.wangwang(self) ## 调用父类的方法,必须带有self
## 调用父类方法2
super().wangwang() ## 注意super()
xiaotq = Xiaotq()
xiaotq.fly()
xiaotq.wangwang()
xiaotq.eat()
# xiaotq.__info() ## 不能继承私有方法
xiaotq.info() ## 能通过该类的公有方法去调用私有属性和方法
print(xiaotq.name) ## 能继承公有属性
# print(xiaotq.__age) ## 不能继承私有属性
6、类属性,类方法,实例方法,静态方法及调用
- 一个程序中尽量使用类或函数中的其中一种
- 推荐使用类,要用到函数时,用静态方法代替函数
- 函数放到类中叫实例方法,@staticmethod标识的叫做静态方法
class Tools(object):
## 类属性
num = 0
## 实例方法,必须要参数self
def __init__(self,new_name):
## 实例属性
self.name = new_name
## 实例中使用类属性,需要加上类名
Tools.num += 1
## 类方法,必须要参数,cls
@classmethod
def add_num(cls):
cls.num = 100
## 静态方法,可以没有参数,等同于函数
@staticmethod
def print_menu():
print("------------")
print("-- 穿越火线1.1 --")
print("- 开始游戏 -")
print("- 结束游戏 -")
print("------------")
tool1 = Tools("铁锹")
tool2 = Tools("锄头")
tool3 = Tools("火钳")
print(tool1.num) ## 实例调用实例属性
## 调用类属性
Tools.add_num() ## 直接使用类名调用类属性
print(Tools.num)
tool = Tools("") ## 创建对象
tool.add_num() ## 类对象调用类方法
print(Tools.num)
## 调用静态方法
Tools.print_menu() ## 通过类名直接调用
tool.print_menu() ## 通过对象调用静态方法