目录
类与对象的理解:
在程序中我们将类看作是设计图纸,对象则是根据这个图纸生产的产品。面向对象编程就是使用对象编程,在类中我们定义成员属性和方法。
来看下面这个例子,创建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
的字典中,应该访问 name
、age
和 address
变量,而不是 self.name
、self.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解释器直接调用,而不需要显式地调用。
以下是一些常见的魔术方法及其功能:
-
__init__(self, ...)
: 初始化方法,用于创建对象实例时进行初始化操作。 -
__str__(self)
: 返回对象的字符串表示形式,可以通过内置函数str()
或print()
调用。 -
__repr__(self)
: 返回对象的可打印字符串表示形式,可以通过内置函数repr()
调用。 -
__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