首页 > 编程语言 >Python基础——类与对象

Python基础——类与对象

时间:2024-10-19 17:18:01浏览次数:3  
标签:__ name Python self 基础 对象 print age def

  

目录

  

类与对象的理解:

构造方法:

魔术方法:

封装:

继承:

 单继承:

 多继承:

复写:


类与对象的理解:

  在程序中我们将类看作是设计图纸,对象则是根据这个图纸生产的产品。面向对象编程就是使用对象编程,在类中我们定义成员属性和方法。

  来看下面这个例子,创建student类,定义对象并对属性赋值。

class Student:
    name=None
    age=None
    def say_hai1(self):
        print(f'大家好,我是{self.name}')
    def say_hai2(self,msg):
        print(f'大家好,我是{self.name},{msg}')

stu_1=Student()
stu_1.name='张三'
stu_1.say_hai1()

stu_2=Student()
stu_2.name='王五'
stu_2.say_hai2('请多多关照')

构造方法:

 语法:__init__()构造方法,创建对象时参数自动传递给__init__()使用,注意构造方法也要使用self。

  在__init__方法里自动声明,前面可以不用先声明。

如下代码:


class Student:
    name=None  # 可省略
    age=None # 可省略
    def __init__(self,name,age):
        self.name=name
        self.age=age
        print("构造函数执行完毕")

stu=Student("iyizuohz",20)
print(stu.name)

 运行结果:

构造方法的练习:

  使用构造方法循环输入三个学生的姓名,年龄,地址,使输出结果如下,最后打印全部学生的信息。

思路: 

  在类中定义两个方法,一个用于循环输入学生信息,一个用来打印全部学生的信息,学生的信息通过列表来存储,其中学生的姓名等信息是字典的键值对形式。

代码:

class Student:
    def __init__(self):
        self.students = []  # 建立一个空列表用于存储学生信息
        for i in range(3):
            print(f"当前录入第{i+1}个学生的信息,总共需要录入3个学生的信息")
            name = input("请输入学生姓名:")
            age = input("请输入学生年龄:")
            address = input("请输入学生地址:")
            # 将学生信息以字典的形式存储到列表中
            self.students.append({'name': name, 'age': age, 'address': address})  # 存储学生信息
            print(f"学生{i+1}的信息录入成功,信息为:【学生姓名:{name},年龄:{age},地址:{address}】")

    def print_students(self):
        print("所有学生的信息如下:")
        for student in self.students:
            print(f"姓名:{student['name']}, 年龄:{student['age']}, 地址:{student['address']}")

s = Student()
s.print_students()  # 打印所有学生的信息

以下代码是常见的错误写法

有以下几个错误原因:

1、属性引用错误:在 self.students.append 的字典中,应该访问 nameage 和 address 变量,而不是 self.nameself.age 和 self.address,因为这些变量仅在 for 循环的局部作用域中定义,并没有将它们作为类的属性进行存储。

2、函数参数:不需要写除了self以外的函数传递参数。

class Studet:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age

student1 = Studet("John", 18, 12)
print(student1)
print(str(student1))

魔术方法:

魔术方法(Magic Methods)是Python中的特殊方法,以双下划线开头和结尾,用于在类中定义特殊行为和操作。这些方法可以被Python解释器直接调用,而不需要显式地调用。

以下是一些常见的魔术方法及其功能:

  1. __init__(self, ...): 初始化方法,用于创建对象实例时进行初始化操作。

  2. __str__(self): 返回对象的字符串表示形式,可以通过内置函数str()print()调用。

  3. __repr__(self): 返回对象的可打印字符串表示形式,可以通过内置函数repr()调用。

  4. __len__(self): 返回对象的长度,可以通过内置函数len()调用。

这些魔术方法可以帮助我们定制类的行为,并在特定情况下自动调用相应的方法。

class Studet:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade
    def __str__(self):
        return f"Student类对象,name:{self.name}, age:{self.age}, grade:{self.grade}"

student1 = Studet("John", 18, 12)
print(student1)

封装:

  现实生活中的属性和行为,对应类中的成员方法和成员变量。但这些属性和行为并不全对用户开放,如一部手机的运行电压,驱动信息并不能让用用户来操作,所以我们需要提供私有成员的形式来支持。

  例如,以下代码定义了一个名为Person的类,其中包含了一个私有属性和一个私有方法:

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
        
    def __display(self):
        print("Name: {}, Age: {}".format(self.__name, self.__age))
 

  注意类中内部的成员可以访问私有  。

 练习:

  打电话时,用户不用检查5G状态,而由程序内部检查,但需要告诉用户当前是否在使用5G通话。

  即将检查5G的函数定义为私有,将打电话的函数定义为公有。

class Phone:
    __is_5g_enabled =   False
    def __check_5g(self):
        if self.__is_5g_enabled:
            print("5G开启")
            return True
        else:
            print("5G关闭,使用4G网络")
            return False
    def call_by_5g(self):
        if self.__check_5g():
            print("正在使用5G网络通话")
        else:
            print("正在使用4G网络通话")

phone = Phone()
phone.call_by_5g()

继承:

 单继承:

  看以下例子,其中 Phone 是一个基础类,提供了通过4G拨打电话的方法。NewPhone 是 Phone 的子类,新增了一个通过5G拨打电话的方法,在newPhone中,依旧可以调用4G拨打电话的方法。

# 单继承
class Phone:
    IMEI=None
    producer=None

    def call_by_4G(self):
        print("Calling by 4G")

class   NewPhone(Phone):
    face_id=10002
    def call_by_5G(self):
        print("Calling by 5G")

p1=NewPhone()
p1.call_by_4G()
p1.call_by_5G()
 多继承:

  多继承对于父类同名的成员,优先级从左至右。

class Phone:
    IMEI=None
    producer='USA'
    def call_by_4G(self):
        print("Calling by 4G")

class NFCReader:
    nfc_id=None
    producer = 'CHINA'
    def read_nfc_id(self):
        print("Reading NFC ID")
    def write_nfc_id(self):
        print("Writing NFC ID")

class XiaomiPhone(Phone,NFCReader):
    # 不再创建新的功能,使用pass语句
  pass # 空语句,表示不实现任何功能

phone = XiaomiPhone()
phone.call_by_4G()
print(phone.producer) # 'USA'
复写:

  如果子类对父类的属性或方法不满意,可以进行重写,直接修改即可。

class Phone:
    IMEI=None
    producer='USA'
    def call_by_4G(self):
        print("Calling by 4G")

class NFCReader:
    nfc_id=None
    producer = 'CHINA'
    def read_nfc_id(self):
        print("Reading NFC ID")
    def write_nfc_id(self):
        print("Writing NFC ID")

class XiaomiPhone(Phone,NFCReader):
   producer = 'ENGLAND'
   def call_by_4G(self):
       print("cutting electricity to call")
       print("Calling by 4G")


phone = XiaomiPhone()
phone.call_by_4G()
print(phone.producer) # 'USA'

# 如果使用

  如果还想继续使用父类的成员,有两种方式,直接通过父类名调用或者通过super()调用

代码演示

class Phone:
    IMEI=None
    producer='USA'
    def call_by_4G(self):
        print("Calling by 4G")

class XiaomiPhone(Phone):
   def call_by_4G(self):
       print("cutting electricity to call")
       # 调用父类的成员和方法
       #法一:直接通过父类名调用
       print(f"调用父类{Phone.producer}")
       Phone.call_by_4G(self)# 传入self
       #法二:通过super()调用
       print(f"调用父类{super().producer}")
       super().call_by_4G() # 不用传入self

phone = XiaomiPhone()
phone.call_by_4G()


# 如果使用

标签:__,name,Python,self,基础,对象,print,age,def
From: https://blog.csdn.net/2301_80162458/article/details/143061082

相关文章

  • Python学习的自我理解和想法(16)
    学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码!今天是学Python的第16天,从今天开始,每天一到两个常用模块,更完恢复到原来的。开学了,时间不多,写得不多,见谅。目录1.datetime模块(1).创建一个日期(2).创建一个时间(3).获取当前的时间(4).获取n天后的时间2.time模块(1)......
  • VSCode + Python + Shell 调试 (Debug) : debugpy
    场境:使用VSCode对一个用Shell脚本启动的Python程序进行Debug.1.debugpy安装在激活了相应的conda虚拟环境后,安装debugpy库:pipinstalldebugpy2.查看可用端口运行forportin{5000..6000};do(echo>/dev/tcp/localhost/$port)>/dev/null2>&1||echo"$portis......
  • 面向对象(下)
    面向对象(下)1、继承继承概述:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。通过extends关键字可以实现类与类的继承class子类名extends父类名{}单独的这个类称为父类,基类或者超类;这多个类可以称为......
  • 面向对象(上)
    第四章面向对象(上)1、面向对象思想概述1、面向对象与面向过程的区别?面向过程的思想:代表语言C语言功能开发中的每一步都是自己参与的面向对象的思想:代表语言java语言指的是不断地创建对象,指挥对象事情过程2、举例现实生活中的例子:接水:面向过程的思想:自己拿......
  • Java基础(一)
    Java基础(一)1、变量与数据类型1、数据类型/*java是一门强类型语言。变量:指的是在java程序运行过程中,其值可以发生改变的量定义一个变量的语句定义格式:数据类型变量名=初始化值;数据类型:基本数据类型:整数类型:所......
  • Java基础(二)
    第三章Java基础(二)1、while循环双重for循环1、while循环:for循环语句和while循环语句可以等价转换,但还是有些小区别的使用区别:控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原......
  • Ubuntu 16.04 编译安装Python 2.7.18
    安装python2.7.18(注)使用aptinstallpython安装的版本是2.7.10,该版本对部分项目存在兼容性问题,因此需要手动编译安装安装python编译环境sudoaptinstallpython-devpkg-configlibreadline-devlibc6-devlibncursesw5-devbuild-essentialgdbpkg-configlibbz2-devlibffi-......
  • 设计一个可复用的 ArkWeb 基础组件架构
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。引言在华为鸿蒙开发环境中,ArkWeb组......
  • js查缺补漏——引用类型对象和数组
    一、什么是引用类型——Object引用类型是一种数据结构,而对象是引用类型的实例。有时候也叫对象定义,包含对象的属性和方法。Object是原生引用类型之一。创建对象实例的方法:1.使用new操作符varobj=newObject()obj.name="aaa"obj.age=122.使用对象字面量的......
  • 【MySQL基础刷题】总结题型(二)
    最多10题,再多不消化了1.至少有5名直接下属的经理2.销售员3.订单最多的客户4.计算布尔表达式的值5.查询球队积分6.苹果和桔子7.两人之间的通话次数8.确认率9.各赛事的用户注册率1.至少有5名直接下属的经理注意左连接的使用selecte1.namefromEmployeee1leftjoi......