对象
1、对象是由类创建出来的一个具体存在,可以直接使用
2、由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法
3、对象相对应用图纸制造的飞机,而图纸是类
4、在开发中,应该先有类然后有对象
5、用类定义出来的对象,类有什么属性对象就有什么属性,不能多也不能少
6、类名:这类事物的名称,满足大驼峰命名法
大驼峰命名法:每一个单词首字母大写,单词与单词之间没有下划线
7、属性:这类事物具有什么特征
8、方法:这类事物具有什么行为
定义只包含方法的类
class 类名:
def 方法1(self,参数列表)
pass
def 方法2(self,参数列表)
pass
方法的定义和函数几乎一样,区别在于有一个self
类名要符合大驼峰命名法
创建对象
对象变量=类名()
class Cat:
def eat(self):
print("猫咪要吃鱼")
def drink(self):
print("猫咪要喝水")
tom=Cat()
tom.eat()
tom.drink()
结果为
猫咪要吃鱼
猫咪要喝水
如果给一个对象添加属性 对象名.属性名=内容
class Cat:
def eat(self):
print("猫咪要吃鱼")
def drink(self):
print("猫咪要喝水")
tom=Cat()
tom.name="大懒猫"
print(tom.name)
结果为:大懒猫
但是不推荐在类的外面定义新的属性,因为如果在运行中没有找到属性就会报错,所以属性应该封装在类里面
init()
初始化方法就是**init()**方法,也是内置方法,init()专门定义类有哪些属性的
在__init__方法内部使用self.属性名=属性的初始值就可以定义属性
定义属性后在使用cat创建的对象,都会拥有该属性
class Cat:
def __init__(self,name):
self.name=name
def eat(self):
print("猫咪要吃鱼")
def drink(self):
print("猫咪要喝水")
tom=Cat("tom")
print(tom.name)
layer_cat=Cat("大懒猫")
print(layer_cat.name)
结果为:
tom
大懒猫
del()
也是一个内置函数,当对象执行完,最后调用的
class Cat:
def __init__(self,name):
self.name=name
def eat(self):
print("猫咪要吃鱼")
def drink(self):
print("猫咪要喝水")
def __del__(self):
print(f'{self.name}走了')
tom=Cat("tom")
lanmao=Cat("懒猫")
print(tom.name)
print(lanmao.name)
print(tom.name)
结果为:
tom
懒猫
tom
tom走了
懒猫走了
class Cat:
def __init__(self,name):
self.name=name
def eat(self):
print("猫咪要吃鱼")
def drink(self):
print("猫咪要喝水")
def __del__(self):
print(f'{self.name}走了')
tom=Cat("tom")
lanmao=Cat("懒猫")
print("--------------------------")
结果为:
‘------------------------------------------------’
tom走了
懒猫走了
class Cat:
def __init__(self,name):
self.name=name
def eat(self):
print("猫咪要吃鱼")
def drink(self):
print("猫咪要喝水")
def __del__(self):
print(f'{self.name}走了')
tom=Cat("tom")
lanmao=Cat("懒猫")
del tom
print("--------------------------")
结果为:
tom走了
‘-------------------------------------------’
懒猫走了
del tom 是删除对象,如果在此行代码下面在调用被删除的属性,则会报错
str()
返回一个对象的描述信息
class cat():
def __init__(self,name):
self.name=name
def __str__(self):
return f"猫的名字叫{self.name}" #返回对象的描述信息
def eat(self):
print(f"我的猫就爱吃饭")
tom=cat("tom")
print(tom)
结果为:
猫的名字叫tom
练习1
用类创建房子类和家具类,分析家具的属性为家具名称和占地面积
分析房子的属性为,房子样式和面积,方法有添加家具
class jiaju():
def __init__(self,name,area):
self.name=name
self.area=area
def __str__(self):
return f"家具的名称是{self.name}家具的占地面积是{self.area}"
led=jiaju("灯",4)
print(led)
cabinet=jiaju("柜子",8)
print(cabinet)
class house():
def __init__(self,house_style,area):
self.house_style=house_style
self.area=area
self.free_area=area
self.jiaju_list=[]
def __str__(self):
return f"户型是{self.house_style}\t总面积是{self.area}\t家具有{self.jiaju_list}\t剩余面积有{self.free_area}"
def adress_jiaju(self,item):
if item.area>self.free_area:
print("家具面积大于剩余面积,所以放不下")
return
else:
self.jiaju_list.append(item.name)
self.free_area=self.free_area-item.area
house1=house("别墅",220)
print(house1)
house1.adress_jiaju(led)
print(house1)
house1.adress_jiaju(cabinet)
print(house1)
结果为:
家具的名称是灯家具的占地面积是4
家具的名称是柜子家具的占地面积是8
户型是别墅 总面积是220 家具有[] 剩余面积有220
户型是别墅 总面积是220 家具有[‘灯’] 剩余面积有216
户型是别墅 总面积是220 家具有[‘灯’, ‘柜子’] 剩余面积有208
练习2
class Gun():
def __init__(self, gun_name, sum):
self.gun_name = gun_name
self.sum = sum
def __str__(self):
return f"这把武器叫{self.gun_name}\t 现在有{self.sum}颗子弹"
def ardess_sum(self, adress_zidanshumu): # 枪添加子弹的方法
if self.sum == 100: # 假设枪能安装100颗子弹
return
elif self.sum + adress_zidanshumu > 100:
print("压入的子弹数超出弹夹容量")
else:
self.sum += adress_zidanshumu
print(f'添加子弹成功,现在有{self.sum}颗子弹')
def fashe(self, fashe_sum): # 枪发射子弹的方法
for i in range(fashe_sum):
if self.sum > 0:
print("哒")
self.sum -= 1
else:
print("没有子弹了")
break
class soldier():
def __init__(self, name,weapons):
self.name = name
self.weapons = weapons
def __str__(self):
return f"我的名字叫{self.name}我的武器是{self.weapons}"
def fire(self):
if self.weapons.sum > 0:
print("我可以冲锋陷阵")
b=int(input("是否要添加子弹 1------添加,2-----不添加"))
if b==1:
c=int(input("请输入你要添加子弹的数目"))
self.weapons.ardess_sum(c)
print(f"现在{self.weapons.gun_name}里面有{self.weapons.sum}颗子弹")
a = int(input("你要开几枪"))
self.weapons.fashe(a)
else:
a = int(input("你要开几枪"))
self.weapons.fashe(a)
AK47 = Gun("ak47", 20)
print(AK47)
AK47.ardess_sum(10)
AK47.fashe(2)
xusanduo = soldier("许三多",AK47)
print(xusanduo)
xusanduo.fire()
私有属性和私有方法
私有属性就是对象不希望公开的属性
私有方法就是对象不希望公开的方法
在定义方法或者属性时,在属性名或者方法名前加俩个_,则表示定义私有属性或者私有方法
class women():
def __init__(self,name):
self.name=name
self.__age=18
def mimi(self):
#在方法内部可以调用私有属性
print(f"她的名字叫{self.name}她的年龄是{self.__age}")
xiaofang=women("小芳")
xiaofang.mimi()
#在外部不能调用私有属性
print(xiaofang.age)
结果为:
她的名字叫小芳她的年龄是18
Traceback (most recent call last):
File “C:/Users/py/PycharmProjects/pythonProject/new2.py”, line 9, in
print(xiaofang.age)
AttributeError: ‘women’ object has no attribute ‘age’
class women():
def __init__(self,name):
self.name=name
self.__age=18
def __mimi(self):
#在方法内部可以调用私有属性
print(f"她的名字叫{self.name}她的年龄是{self.__age}")
xiaofang=women("小芳")
xiaofang.__mimi()
结果为:
Traceback (most recent call last):
File “C:/Users/py/PycharmProjects/pythonProject/new2.py”, line 9, in
xiaofang.__mimi()
AttributeError: ‘women’ object has no attribute ‘__mimi’
一个下划线加类名加方法名可以访问私有方法或属性
class women():
def __init__(self,name):
self.name=name
self.__age=18
def __mimi(self):
#在方法内部可以调用私有属性
print(f"她的名字叫{self.name}她的年龄是{self.__age}")
xiaofang=women("小芳")
xiaofang._women__mimi()
print(xiaofang._women__age)
结果为:
她的名字叫小芳她的年龄是18
18