python(day030——面向对象3)

030-最佳实践与案例分析 Loguru日志库最佳实践与案例分析摘要 本章总结了Loguru日志库的核心应用,重点介绍了开发与生产环境中的最佳实践方案。内容包括: 日志级别规范:详细展示了从TRACE到CRITICAL各级别的适用场景,以及开发/生产环境的不同配置策略 结构化日志实现:通过数据类(LogEvent)和枚举(EventType)实现标准化日志格式,支持自动JSON序列化和关键业务事件分类记录 多场景处理方案: 开发环境启用彩色调试输出 生产环境按天轮转日志文件并压缩存储 错误日志单独保存并延长保留周期 支持用户行为、业务 阅读详情

1.面向对象编程:通过类来进行编写程序

面向过程:c语言,不适用类的方式

类的好处:将一个东西的状态封装到实例变量中,通过实例方法制定维护状态(实例变量和类变量)的规则,一次来实现数据的安全和一致性,减少脏数据。

class Person: #类定义,类对象:类变量和方法
    COUNT=0 #类变量
    def __init__(self,name,age):  #构造函数(方法)
        self.name=name #name是局部变量,存到实例变量中
        self.age=age
        Person.COUNT+=1 #对类变量进行累计
#局部变量:函数内参数,自己定义的没有self的变量,仅在函数内部有效
#实例变量:self.xxx,可以在类里面的所有方法使用
#类变量:在类中的方法外面定义,全局只有一份,使用时候是“类名.类变量名”。
      # 如果此实例中没有和类变量同名的实例变量,则可以使用self.类变量名来进行读取类变量的值
    def get_age(self):
        return self.age

    def set_age(self,age):  #设定了年龄的修改规则
        if isinstance(age,(int,float)) and 0<age<200:
            self.age=age

    @staticmethod  #静态方法
    def count_person():
        return Person.COUNT  #返回一个类变量




p1=Person("小草",3) #实例化的时候,自动调用__init__方法,将数据传入构造方法中的name
p2=Person("小花",5)

print(p1.get_age())
p1.set_age(22)
print(p1.get_age())

print("通过类名读取类变量",Person.COUNT)
print("通过实例名读取类变量",p1.COUNT)
print("通过类名调用静态方法",Person.count_person())  #通过类名调用静态方法
print("通过实例调用静态方法",p1.count_person())  #通过实例调用静态方法
#类:用过class定义的代码
#类对象:类变量和所有类中定义的方法(实例方法、静态方法、类方法)
#实例对象:实例变量和对应类所在的地址(指针)

#实例方法:定义参数一定要有self、只能实例调用。可以使用实例变量和类变量。
#类方法:@classmethod,必须有一个cls的方法参数,传类对象的内存地址。里面不能使用self.xxx的实例变量。
        #可以通过类名或者实例名调用
#静态方法:@staticmethod,可以没有任何参数。里面不能使用self.xxx的实例变量。
        #可以通过类名或者实例名调用

#print(id(p1))#两实例内存地址不一样
#print(id(p2))

私有变量和私有方法

class Person: #类定义,类对象:类变量和方法
    COUNT=0 #类变量
    __FLAG=0
    def __init__(self,name,age):  #构造函数(方法)
        self.name=name #name是局部变量,存到实例变量中
        self.__age=age
        Person.COUNT+=1 #对类变量进行累计

    def get_age(self):
        return self.__age

    def set_age(self,age):  #设定了年龄的修改规则
        if isinstance(age,(int,float)) and 0<age<200:
            self.__age=age

    def __count_person(self):  #私有方法
        return Person.COUNT ,22 #返回一个类变量

    def get_count(self):  #在实例方法中调用私有方法
        return self.__count_person()
#私有方法:方法名前需要有两个__。只能在类的内部的其他方法中调用私有方法
         #在类的外部不允许直接调用私有方法。

p1=Person("小草",3) #实例化的时候,自动调用__init__方法,将数据传入构造方法中的name
p2=Person("小花",5)

print(p1.get_age())
#p1.age=11  #实例变量的值可以在外面改变,不安全
#print(p1.__age)  #会报错,因为禁止从外部访问私有变量
p1.__age=-2  #并没有改变私有变量,只是生成一个新的实例变量__age。和类里面的self.__age不是同一个变量
print(p1.get_age())

#怎么不让外面的代码随便更改,必须走实例方法?——通过私有变量:__xxxx
#私有变量:self.__xxx。在类外面禁止访问,不能通过实例名、类名等访问。例如实例名.私有变量名 是无法读到
         #只能通过访问类中包含私有变量的方法调用,类中所有实例方法均可以调用私有变量
         #类变量也可以私有化

print(p1.get_count()) #调用实例方法,该实例方法在类中调用了私有方法

类的内置方法

class Person: #类定义,类对象:类变量和方法
    COUNT=0 #类变量

    def __init__(self,name,age):  #构造函数(方法)
        self.name=name #name是局部变量,存到实例变量中
        self.__age=age
        Person.COUNT+=1 #对类变量进行累计

    def __str__(self):  #当你打印一个实例时候,会自动调用——>print(p1)
        return "%s很可爱。" % self.name

    def __repr__(self):  #在交互模式下,不使用print,直接写实例变量名称则直接自动调用此方法
        return "%s在努力。" % self.name

    def __iter__(self):  #把实例编程一个可迭代的对象
        return iter("hello")
#iter("hello")和"hello"区别:
    # "hello"直接存在内存中。
    # iter("hello")每次只有一个值存储在内存中,当迭代时候,去取下一个值,这样就实现了节省内存的目的。


p1=Person("小花",3)
p2=Person("小草",5)

print(p1)  #调用__str__方法

repr(p1) #在交互模式下可直接打印返回内容
print(repr(p1)) #加print模拟交互模式
#若没有定义__str__方法,但是定义了__repr__方法,则print(实例名)会自动调用__(repr)__方法

for i in p1: #调用__iter__方法
    print(i)
#for i in p1触发了一个机制,自动调用p1实例的__iter__方法
#该代码等价于:for i in iter(["hello"])

继承

子类调用父类的构造函数有两种方法,基本语法如下: 1、super(subclassName, self).__init__( [parameter1[,parameter2....]]) 2、superclassName.__init__(self,  [parameter1[,parameter2....]])

#继承:子类继承父类,自动获取父类中的实例变量和实例方法,不能继承私有变量和私有方法
#统一管理
class Person:  #父类中存大家都有的信息
    def __init__(self,name):
        self.name = name

    def get_name(self):
        return self.name

    def set_name(self,value):
        self.name =value

class AsianPerson(Person):
    #子类中存个性化信息,子类实际上是基于父类做的扩展
    def __init__(self,name):
        Person.__init__(self,name)
        self.hair_color ="black"

a=AsianPerson("小花")
print(a.get_name())
a.set_name("小草")
print(a.name)
print(a.hair_color)
#继承:子类继承父类,自动获取父类中的实例变量和实例方法,不能继承私有变量和私有方法
#统一管理
class Person:  #父类中存大家都有的信息
    def __init__(self,name):
        print("Person父类被实例化了!")
        self.name=name

class AsianPerson(Person):
    pass

a=AsianPerson()
#当子类没有实现__init__方法,就会调用父类的__init__方法,若父类中的__init__方法需要传入参数,则会报错。
#需要在实例化时候传入参数。
#继承:子类继承父类,自动获取父类中的实例变量和实例方法,不能继承私有变量和私有方法
#统一管理
class Person:  #父类中存大家都有的信息
    def __init__(self,name):
        print("Person父类被实例化了!")
        self.name=name
        self.__value=100

    def __print__info(self):
        print("私有方法被调用")

#子类中存个性化的信息,子类实际是基于父类做的扩展
class AsianPerson(Person):
    def __init__(self,color): #子类构造方法,明确调用父类的构造方法
        #子类构造方法没有调用父类构造方法,那么父类的构造方法不会被自动调用
        #Person.__init__(self,name)
        self.color = color
        #print(self.__print__info()) #会报错,父类私有方法和变量无法被子类调用

a=AsianPerson("小花","black")
#当子类没有实现__init__方法,就会调用父类的__init__方法,若父类中的__init__方法需要传入参数,则会报错。
#需要在实例化时候传入参数。

#总结:
#子类一定实现__init__方法,明确调用父类__init__方法。把所有的实例变量都初始化,那么后续使用肯定没问题。
#重写override
class Person:  #父类中存大家都有的信息
    def __init__(self,name):
        self.name=name

    def print_info(self):
        print("打印父类信息")
class AsianPerson(Person):
    def __init__(self,name,color):
        Person.__init__(self,name)
        self.color=color


    #重写override:将父类方法重写
    def print_info(self):
        print("打印子类信息")
        Person.print_info(self)  # 子类方法也可以明确调用父类方法


a=AsianPerson("小花","pink")
a.print_info()  #优先调用子类中的同名方法,如果没有则调用父类的同名方法
#多继承
class Person:  #父类中存大家都有的信息
    def __init__(self,name):
        self.name=name

    def print_info(self):
        print("2打印父类信息")
class AsianPerson(Person):
    def __init__(self,name,color):
        Person.__init__(self,name)
        self.color=color


    #重写override:将父类方法重写
    def print_info(self):
        print("1打印子类信息")
        Person.print_info(self)  # 子类方法也可以明确调用父类方法

class Chinese_Person(AsianPerson):
    def __init__(self,name,color):
        AsianPerson.__init__(self,name,color)



c=Chinese_Person("小花","pink")
c.print_info()
#例子:
class Member:
    def __init__(self,school,name):
        self.name=name
        self.school=school

    def get_name(self):
        return self.name

    def get_school(self):
        return self.school

    def set_name(self,name):
        self.name=name

    def set_school(self,school):
        self.school=school

class Teacher(Member):
    def __init__(self,school,name,teacher_Id,subject,salary):
        Member.__init__(self,school,name)
        self.teacher_Id=teacher_Id
        self.subject=[]
        if isinstance(subject,str):
            self.subject.append(subject)
        elif isinstance(subject,(list,tuple)):
            for i in subject:
                self.subject.append(i)
        self.salary=salary

    def set_salary(self,salary):
        self.salary=salary

    def get_salary(self):
        return self.salary

    def set_subject(self,subject,opt="add"):
        if opt=="add":
            self.subject.append(subject)
        else:
            try:
                self.subject.remove(subject)
            except:
                print("%s课程不存在,无法删除" % subject)

    def get_subject(self):
        return self.subject

    def set_teacher_Id(self,teacher_Id):
        self.teacher_Id=teacher_Id

    def get_teacher_Id(self):
        return self.teacher_Id

    def print_info(self):
        print("%s老师的ID是:%s\n所在学校是%s\n工资是%s\n教的课程是%s" %
              (self.name,self.teacher_Id,self.school,self.salary,self.subject))

class Student(Member):
    def __init__(self,school,name,student_id,subject,classes):
        Member.__init__(self,school,name)
        self.student_id=student_id
        self.subject = []
        if isinstance(subject, str):
            self.subject.append(subject)
        elif isinstance(subject, (list, tuple)):
            for i in subject:
                self.subject.append(i)
        self.classes=classes

    def set_classes(self,classes):
        self.classes=classes

    def get_classes(self):
        return self.classes

    def set_student_id(self,student_id):
        self.student_id=student_id

    def get_student_id(self):
        return self.student_id

    def set_subject(self,subject,opt="add"):
        if opt=="add":
            self.subject.append(subject)
        else:
            try:
                self.subject.remove(subject)
            except:
                print("%s课程不存在,无法删除" % subject)

    def get_subject(self):
        return self.subject

    def print_info(self):
        print("%s学生的ID是:%s\n所在学校是%s\n班级是%s\n学的课程是%s" %
              (self.name,self.student_id,self.school,self.classes,self.subject))


t=Teacher("一中","王老师","001",["数学","英语"],"3000")
s=Student("一中","王小花","002",["数学","英语"],"三年级三班")
t.print_info()
print("*"*20)
s.print_info()

 

腾讯云智后台开发实习面试全纪录(已offer) 腾讯云智后台开发实习面经 阅读详情

相关推荐

NOIP2008年普及组初赛题目答案及解析

NOIP2008年初赛详细题解

城南蝈蝈 926

python def __init__(self, name等多参数), def __init__(self)

最开始准备秋招的时候,接触的都是这两个的区别;__init__(self) 初始化,__new__实例化方法,两者执行的顺序,先有实例,才能初始化。 之前一直对__init__(self)里面的参数很迷茫,一会这个地方看到别人这么写,一会看到别人那么写,自己也不知道,到底怎么回事,有哪些区别,今天对这个内容进行了学习。进行系统的分析了解,主要从他的实例化的区别,含义的区别进行区分两者之间的关系!...

sunny的博客 16万+

【现代信号处理】01 -概率论与随机过程回顾

概率论与随机过程回顾 文章目录概率论与随机过程回顾1. 统计模型的相关概念1.1 统计实验(不确定性)1.2 样本点1.3 样本空间Ω1.4 概率1.5.统计模型是先验的2. 概率和统计的差异2.1 联系2.2 差异2.3.1 概率和统计问题的三要素2.3.1.1 model-模型2.3.1.2 data-数据2.3.1.3 decision-决策2.3.2 关系图3. 样本空间的重要性3.1 贝朗特悖论3.1.1 解法一3.1.2 解法二3.1.3 解法三3.2 结论4.概率相关的概念4.1 随机变量4.

qq_41741344的博客 1405

天梯赛训练L1-021——L1-030

【代码】天梯赛训练L1-021——L1-030。

qq_50196144的博客 368

Comsol 压电换能器声场仿真(远场分析、边界元法优化)

本文详细介绍了在Comsol中使用边界元法进行压电换能器远场声场仿真的高效方法。针对传统有限元法计算远场时内存消耗大、耗时长的问题,文章阐述了边界元法在处理无限域、提升计算效率和精确获取远场指向性方面的核心优势,并提供了从多物理场耦合设置、网格划分策略到求解器配置及结果验证的完整实战指南。

weixin_29045585的博客 408

解决WSL2网络隔离:Ubuntu子系统共享Windows代理的3种方法

本文详细解析了WSL2的网络隔离特性,并提供了三种在Ubuntu子系统中共享Windows代理的实用方法:环境变量法、配置文件法和系统服务法。通过具体代码示例和方案对比,帮助开发者快速解决WSL2网络访问问题,实现一键设置代理,提升开发效率。

weixin_29295541的博客 452

DAY 030:《CS=Coding Science》

DAY 030:《CS=Coding Science》

HilariousBojack的博客 117

Ubutntu下使用realsense d435i(二):获取某二维像素点的三维坐标

00 准备工作 准备工作包括安装驱动以及pyrealsense2,具体可参考上一篇: Ubutntu下使用realsense d435i(一):准备工作以及安装pyrealsense2 https://blog.youkuaiyun.com/gyxx1998/article/details/121461293 01 通过二维像素点获得物体三维坐标 这个在上一篇已经介绍了代码: realsense d435i获取某像素点三维坐标(计算深度和点云两种方法) https://blog.youkuaiyun.com/gyxx1998/

gyxx1998的博客 9944

Day030: 双端队列:灵活的队列操作

在数据结构与算法的学习中,双端队列(Deque)是一种重要的数据结构,它结合了队列和栈的特点,可以在队列的两端进行灵活的操作。双端队列不仅可以在队尾添加和删除元素,还可以在队首进行添加和删除操作,这使得它在许多应用场景中表现出色。本文将详细介绍双端队列的定义、基本操作、应用场景以及在 Python 中的实现方法。

u014481728的博客 1100

ROS Noetic下Gazebo仿真:从零搭建两轮差速机器人(含ros_control配置避坑指南)

本文详细介绍了在ROS Noetic环境下,使用Gazebo从零搭建两轮差速机器人并进行仿真的完整流程。核心内容包括利用Xacro进行模块化建模,并重点解析了通过ros_control框架配置机器人运动控制的详细步骤与常见避坑指南,帮助开发者成功实现机器人在仿真环境中的差速驱动与运动控制。

game4的博客 620

selenium绕过检测,规避检测

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined或者为false。而使用selenium访问则该值为true。那么如何解决这个问题呢?我们正常浏览器登录查看,window.navigator.webdriver的值为false我们通过selenium打开的网页,测试,可见window.navigator.webdriver的值为true。

景天科技苑 1万+

【Python学习笔记】- Day3

Python学习笔记Day3 基本数据类型 整数类型 十进制 无引导符号 二进制 0b或0B 八进制 0o或0O 十六进制 0x或0X pow(x,y)函数,用来计算x的y次方 可以嵌套使用 pow(x,pow(y,z)) 浮点数类型 与数学中的实数的概念一样,表示带有小数的数值 高精度浮点数 :通过标准库decimal提供更精确的数字类型decimal,在使用过程中,需要用单引号,如decimal.Decimal(‘20’) getcontext().prex参数自定义浮点数精度

ijwwio的博客 994

【100%通过率】华为OD机试真题 Python【数字最低位排序】【最低位排序】

2023华为OD机试真题 Python【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 1902

day-030-综合练习-笔记管理器

第一阶段最后一天,做一个完整的笔记管理器,然后回顾这 30 天我们学到了什么。

chouchuang的博客 250

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

入门学习-Python-小甲鱼学习资料-Day030-文件系统:介绍一个高大上的东西

根据视频自行练习 os模块中关于文件/目录常用的函数使用方法 函数名 使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path=’.’) 列举指定目录中的文件名(’.‘表示当前目录,’…‘表示上一级目录) mkdir(path) 创建单层目录,如该目录已存在抛出异常 makedirs(path) 递归创建多层目录,如该目录已存在抛出异常,注意:...

seven1levin的博客 510

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

PYTHON 基础-DAY3/4 20210403

目录030 可变字符串031 运算符总结、位操作符、优先级问题第三章序列032-039列表040-042 元组tuple043-049 字典050 集合 030 可变字符串 可变字符串:可通过io.StringIO对象或array模块 a='hello,sun' sio=io.StringIO(a) #sio即为可变对象 sio.seek(7) #移动到第七个字符 sio.write('g') #修改第七个字符 sio.getvalue() #不能通过直接

weixin_47442524的博客 371

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python入门编程100例(021-030)

""" p021:统计学生爱好的人数 """ if __name__ == '__main__': like_count = {} with open("./p021_student_like.txt", encoding="utf-8") as fp: for line in fp: line = line[:-1] sname, likes = line.split() like_list = l.

指尖魔法师 937

Python实训day4

''' 2 爬取豆瓣TOP250电影信息 3 4 主页: 5 第一页: 6 https://movie.douban.com/top250?start=0&filter= 7 第二页: 8 https://movie.douban.com/top250?start=25&filter= 9 ...

weixin_30914981的博客 342

廖雪峰python3复习总结——day10-3

Base64:一种用64个字符来表示任意二进制数据的方法。Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。 import bas...

weixin_41124748的博客 202

Python学习--day 05

Python学习——day05024.练习英雄联盟 024.练习英雄联盟

qinshimingyue27的博客 224

python-study-day3

python学习

阿宝的博客 329

Day-5 python

上周作业:爬取豆瓣TOP250电影信息 1 ''' 2 爬取豆瓣TOP250电影信息 3 4 主页: 5 第一页: 6 https://movie.douban.com/top250?start=0&filter= 7 第二页: 8 https://movie.douban.com/top250...

weixin_30576827的博客 367

Python基础day11强化练习(上)

应用:老王开枪 1.人类 属性 姓名 血量 持有的枪 方法 安子弹 安弹夹 拿枪(持有抢) 开枪 2.子弹类 属性 杀伤力 方法 伤害敌人(让敌人掉血) 3.弹夹类 属性 容量(子弹存储...

heima201907的博客 245

python作业day1—用户登陆

跟着老男孩培训写的第一次作业 需求: 1、用户可以通过用户名和密码登陆; 2、密码输入错误三次后即锁定用户 3、把用户名、密码、锁定后的用户放在文件里 4、如果没有该用户提示还没有注册 5、使用锁定的用户登陆会提示此用户已经被锁定了 1 #! /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 username = r...

weixin_33995481的博客 164

python学习-day12 hashlib

视频链接:https://www.bilibili.com/video/BV1SE411N7Hi?p=81 课件内容:https://guobaoyuan.gitee.io/new_book/Python/17-4%20hashlib.html 以下内容仅供个人学习使用,侵删 #!/usr/bin/env python # -*- coding:utf-8 -*- ''' hashlib:加密 md5,sha1,sha256,sha512等 越长,速度越慢 加密:明文-》字节-》密文 密文是不可

laywl的专栏 209

Python基础day12飞机大战(下)

飞机大战代码:显示敌机 [Python]纯文本查看复制代码 ? 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 ...

xiaoyaGrace的博客 243
上一篇: python(day029——面向对象2)
下一篇: day001——HTML初接触
王总总
博客等级 码龄8年 2粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值