创造类的方式
class 类名(object):
属性
方法
类名用大驼峰命名法
函数在类中叫做方法
类名后面的括号用来继承
class Student(object):name = Noneage = Noneid = Noneprint(Student)
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\1.py
<class '__main__.Student'>
实例化对象
对象名=类名()
class Student(object):name = Noneage = Noneid = Noneif __name__ == '__main__':stu1=Student()print(stu1)
默认打印的是内存地址
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\1.py
<__main__.Student object at 0x0000019F6C192060>
访问实例化对象方法与属性
对象名.方法
对象名.属性
class Student(object):name = Noneage = NoneZhuanye = Noneid = Noneif __name__ == '__main__':stu1 = Student()stu1.id = 2001stu1.name = "vn"print(stu1.name)print(stu1.id)
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\1.py
vn
2001
self
- self会默认指向调用这个方法的的对象本身,可以修改名称,单值一定,且不参与传参
- 打印self指向一块内存地址,是stu1的内存地址
class Student(object):name = Noneage = NoneZhuanye = Noneid = Nonedef hobby(self):print(self)
if __name__ == '__main__':stu1 = Student()stu1.hobby()
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\1.py
<__main__.Student object at 0x0000019F15D72180>
class Student(object):name = Noneage = NoneZhuanye = Noneid = Nonedef hobby(self):print(self.name)if __name__ == '__main__':stu1 = Student()stu1.name = "vn"stu1.hobby()
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\1.py
vn
初始化对象
- 定义类经常会用到__init__函数(方法),首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问。而__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量)。__init__函数(方法)的第一个参数必须为self,后续参数为自己定义。
- def __init__(self,参数):
参数赋值
当使用print输出对象的时候,只要自己定义了
__str__(self)
方法,那么就会打印从在这个方法中return的数据
__str__
方法需要返回一个字符串,当做这个对象的描写
class Person(object):def __init__(self,name,age,zhuanye,id):self.name=nameself.age=ageself.id=idself.zhuanye=zhuanyedef eat(self):print("吃饭了")def __str__(self):return f"人的名字是{self.name}"obj1 = Person("zhangsan",55,"liuliu",45678)
print(obj1.name)
在pycharm中对象初始化会自动出现提示标语;
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\2.py
zhangsan
练习
class HouseItem(object):def __init__(self,itemname,area):self.name=itemnameself.area=areadef __str__(self):return f"{self.name}的占地面积是{self.area}"
if __name__== '__main__':bed=HouseItem("席梦思",4)chest = HouseItem("衣柜",2.5)table = HouseItem("餐桌", 2)
print(bed)
print(chest)
print(table)
打印对象默认返回内存地址,但是因为用来魔术方法 :def __str__(self):,所以可以返回想要的
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\房子.py
席梦思的占地面积是4
衣柜的占地面积是2.5
餐桌的占地面积是2
class HouseItem(object):def __init__(self,itemname,area):self.name=itemnameself.area=areadef __str__(self):return f"{self.name}的占地面积是{self.area}"class House(object):def __init__(self, House_type,area):self.type = House_typeself.area = areaself.free_area = areaself.item_list = []def add_item(self,item):# print(f"添加的家具是={item}")if self.area < item.area:print("剩余空间不够,放不下")else:self.item_list.append(item.name)self.free_area-=item.areadef __str__(self):return f"房子的户型是{self.type},赋值的总面积是{self.area},房子剩余面积为{self.free_area},占地面积是{self.area-self.free_area},家具列有{self.item_list}"if __name__== '__main__':house=House("三室一厅",21)bed = HouseItem("席梦思", 4)chest = HouseItem("衣柜", 2.5)table = HouseItem("餐桌", 2)house.add_item(bed)print(house)
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\房子.py
房子的户型是三室一厅,赋值的总面积是21,房子剩余面积为17,占地面积是4,家具列有['席梦思']
面对对象的特征:封装、继承、多态
封装:
a、把类的成员全部封装在类中
b、不希望被随意访问,因此在大多数情况下,往往要对对象的属性私有化,提供公开的方法进行访问
私有的成员在类内部才能用方法访问到
私有方法就在类内部调用python成员私有声明:__属性/方法
访问私有成员:对象名._类名__成员
class Login(object):def __init__(self,u,p):self.name=uself.__passwd=pdef get_passwd(self):return self.__passwddef set_passwd(self,pp):self.__passwd=ppreturn f"新的密码更改为{self.__passwd}"if __name__ == '__main__':obj1 = Login("rtyu",56789)print(obj1._Login__passwd)print(obj1.set_passwd("张三王麻子"))
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\封装2.py
56789
新的密码更改为张三王麻子
_方法名,_变量(不能被其他模块所引用), 主要针对from 模块 import *
封装:全局方法:
#通过我们的全局方法
class Login(object):def __init__(self,u,p):self.name=uself.__passwd=pdef get_passwd(self):return self.__passwddef set_passwd(self,pp):self.__passwd=ppreturn f"新的密码更改为{self.__passwd}"pp=property(get_passwd,set_passwd)if __name__ == '__main__':obj1 = Login("rtyu",56789)print(obj1.pp)#相当于调用了get_passwdobj1.pp = "心得"#相当于调用了set_passwdprint(obj1.pp)
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\封装2.py
56789
心得
第三种封装方法
#通过我们的全局方法
class Login(object):def __init__(self,u,p):self.name=uself.__passwd=pdef get_passwd(self):return self.__passwddef set_passwd(self,pp):self.__passwd=ppreturn f"新的密码更改为{self.__passwd}"@propertydef passwd(self):return self.__passwd@passwd.setterdef passwd(self,pp):self.__passwd=pp
if __name__ == '__main__':obj1 = Login("rtyu",56789)print(obj1.passwd)obj1.passwd="我是一个新人"print(obj1.passwd)
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\封装2.py
56789
我是一个新人
函数覆盖
函数重载:存在多个函数名相同的函数,但是参数个数或者参数类型不同,
会使在调用的时候,自动调用对应的参数
- python里面没有函数重载,python是弱数据类型的语言。
- python有函数覆盖,相同函数会得到同名的、离调用最近的函数覆盖
继承
继承:
父类:被继承的一方 超类 基类
子类:继承的那一方无法继承父亲的私有成员
没有成员的子类
class Dad(object):def __init__(self,name,age,money):self.name = nameself.age = ageself.money = moneydef eat(self):print("我是父亲爱吃的")def zhuanqian(self):print("爸爸的赚钱")class Son(Dad):passf = Dad("zhangxi",56,"1万")s = Son("二狗",11,100020)
print(s.age)
s.eat()
print(s.money)
print(s.name)
s.zhuanqian()
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\函数重载.py
11
我是父亲爱吃的
100020
二狗
爸爸的赚钱
有自己成员的子类
- super这个方法这个指针指向自己 的父类
- 自己没有的才会去继承父亲的
class Dad(object):def __init__(self,name,age,money):self.name = nameself.age = ageself.money = moneydef eat(self):print("我是父亲爱吃的")def zhuanqian(self):print("爸爸的赚钱")class Son(Dad):def __init__(self,hobby,age,name):super().__init__("zhangsan",34,"100000")self.age = ageself.name=nameself.hobby = hobbydef zhuanqian(self):print("我的赚钱")f = Dad("zhangxi",56,"1万")s = Son("sing",11,"里斯")
print(s.age)
print(s.money)
print(s.hobby)
print(s.name)
s.zhuanqian()
s.eat()
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\函数重载.py
11
100000
sing
里斯
我的赚钱
我是父亲爱吃的
方法重写
要是非要想要调用父亲的方法,可以利用super
比如:
def zhuanqian(self):
super().zhuanqian()
多继承
支持继承多个类
class Dad(object):def __init__(self,name,age,money):self.name = nameself.age = ageself.money = moneydef eat(self):print("我是父亲爱吃的")def zhuanqian(self):print("爸爸的赚钱")class Mon(object):def mon(self):print("mamama")class Son(Dad,Mon):def __init__(self,hobby,age,name):super().__init__("zhangsan",34,"100000")self.age = ageself.name=nameself.hobby = hobbydef zhuanqian(self):print("我的赚钱")f = Dad("zhangxi",56,"1万")s = Son("sing",11,"里斯")
print(s.age)
print(s.money)
print(s.name)
s.zhuanqian()
s.eat()
s.mon()
结果:
E:\Python\python.exe E:\学习笔记\Python\4.21\函数重载.py
11
100000
里斯
我的赚钱
我是父亲爱吃的
mamama