一、介绍
1、特点
面向对象
对象:对客观事物的抽象
对一个具体事务的存在,现实生活中可以看得见摸得着的
可以直接使用的
2、类和对象的关系
类:对对象的抽象
具有相似内部状态和运动规律的实体的集合(或统称为抽象)
具有相同属性和行为事物的统称
类∶是创建对象的模板
对象︰是依据类产生的一个具体实例
二、类
self的介绍
1、类的定义
在Python中,使用class
关键字定义一个类。类名通常采用大驼峰命名法(即每个单词首字母大写,其余小写)。类可以包含属性(变量)和方法(函数)。
2、类的创建
示例
class Hero: #定义一个类hp = "我快没血了" #定义成员变量 不建议使用,只读不可修改def printmsg(self): #定义一个成员函数 , self相当于this指针print("我是提莫我快乐") #函数体#类的使用
timo = Hero() #定义一个类对象
timo.printmsg() #类对象调用函数
print(timo.hp)
输出结果
3.对象的添加
示例
class Hero: #定义一个类hp = "我快没血了" #定义成员变量 不建议使用,只读不可修改def printmsg(self): # 定义一个成员函数 , self相当于this指针print("我是提莫我快乐") # 函数体timo = Hero() #定义一个类对象
timo.printmsg() #类对象调用函数
print(timo.hp)
#添加对象
timo.name = "提莫"
timo.age = 18
print("名字:{}, 年龄: {}".format(timo.name, timo.age))
结果
4、魔法方法
1)定义
在Python中,魔法方法(也称为特殊方法)是以双下划线(__
)开头和结尾的方法,它们提供了一种方式来实现和修改对象的内置行为。这些方法允许开发者对Python的内置操作进行自定义实现,比如算术运算、项访问、属性访问、字符串表示等。
2)魔法方法的使用
a、__init__(self,[...]): 构造器
class Hero: #定义一个类#魔法方法: __init__(self): 构造器,相当于析构函数def __init__(self):self.jn = "大招"timo = Hero()
print("技能:{}".format(timo.jn))
class Hero: #定义一个类#魔法方法: __init__(self): 构造器,相当于析构函数def __init__(self, name = "提莫", age = 18, hp = 1800):self.jn = "大招"self.name = nameself.age = ageself.hp = hptimo = Hero()
print("姓名:{}, 年龄:{}, 血量:{},技能:{}".format(timo.name, timo.age, timo.hp, timo.jn))
b、__del__(self) :析构器
它在对象生命周期结束时被调用,用于执行对象的清理工作。
class Hero: #定义一个类#魔法方法: __init__(self): 构造器,相当于析构函数def __init__(self, name = "提莫", age = 18, hp = 1800):self.jn = "大招"self.name = nameself.age = ageself.hp = hpprint("对象创建成功")def __del__(self):print("对象消除成功")
timo = Hero()
print("姓名:{}, 年龄:{}, 血量:{},技能:{}".format(timo.name, timo.age, timo.hp, timo.jn))
三、类的继承
1、单继承
在面向对象编程中,单继承指的是一个子类(派生类)仅继承自一个父类(基类)。这种继承机制允许子类获取父类的属性和方法,同时也可以添加或修改属性和方法,以实现特定的功能
示例
#定义父类
class Parent: #定义一个类#魔法方法: __init__(self): 构造器,相当于析构函数def __init__(self):self.val = "我是父类属性"def __del__(self):print("父类对象消除成功")def show(self):print("{}".format(self.val))#定义派生类确定继承关系
class Child(Parent):def __init__(self):# 调用父类的__init__方法super().__init__()self.childVal = "我是子类属性"def show1(self):print(self.childVal)def __del__(self):print("派生类对象消除成功")# 创建子类实例
child = Child()
# 调用继承自父类的方法
child.show() # 输出: 我是父类属性
# 调用子类的方法
child.show1() # 输出: 我是子类属性
在子类中,super()
函数是一个特殊的函数,它返回的是一个临时对象,该对象允许你调用父类中定义的方法。最常见的用途是在子类中调用父类的初始化方法__init__
,就像上面的示例那样。这样做可以确保父类被正确地初始化
2、多继承
虽然单继承使得继承关系更加简单和清晰,但它也有其局限性。在某些情况下,一个类可能需要从多个源继承属性和方法,单继承无法满足这种需求。Python 为此提供了多继承机制,允许一个类同时继承多个父类,以覆盖单继承的这一局限性。
示例
#定义父类
class Parent1:def __init__(self):self.val = "我是父类属性一"def show1(self):print("{}".format(self.val))class Parent2:def __init__(self):self.val = "我是父类属性二"def show2(self):print("{}".format(self.val))#定义派生类确定继承关系
class Child(Parent1, Parent2):def __init__(self):# 调用父类的__init__方法super().__init__()self.childVal = "我是子类属性"def show(self):print(self.childVal)def __del__(self):print("派生类对象消除成功")# 创建子类实例
child = Child()
# 调用继承自父类的方法
child.show1() # 输出: 我是父类属性一
child.show2() # 输出: 我是父类属性二
# 调用子类的方法
child.show() # 输出: 我是子类属性
3、私有继承
在面向对象编程中,私有继承是一种特殊的继承方式,它允许子类继承父类的实现细节,包括私有成员和保护成员。私有继承并不常见,因为它通常会导致紧耦合的代码,使得子类与父类之间过于依赖。
在Python中,没有直接支持私有继承的语法。Python中的继承是默认公有继承,即子类可以访问父类的公有成员(公有方法和属性),但不能直接访问父类的私有成员。
然而,通过一些技巧,可以模拟私有继承的效果
示例
class Parent1:def __init__(self):self.public_var = "Public" #公有self._protected_var = "Protected" #保护self.__private_var = "Private" #私有def public_method(self):print("This is a public method")def _protected_method(self):print("This is a protected method")def __private_method(self):print("This is a private method")class Child(Parent1):def __init__(self):super().__init__()def access_base_members(self):# 可以访问父类的公有成员print(self.public_var) # 输出: Public# 可以访问父类的保护成员print(self._protected_var) # 输出: Protected# 不能直接访问父类的私有成员# print(self.__private_var) # 报错def call_base_methods(self):self.public_method() # 可以调用父类的公有方法self._protected_method() # 可以调用父类的保护方法# self.__private_method() # 报错,无法调用父类的私有方法child = Child()
child.access_base_members()
child.call_base_methods()
4、私有继承@property用法
在 Python 中,@property
装饰器用于将类的方法转换为属性,从而实现对属性的访问和设置时可以执行特定的逻辑。使用 @property
装饰器可以使代码更具可读性和易用性。
示例
class Demo:def __init__(self, name, age, sex):#__开头的变量名为 私有成员, 在类的外部不能被直接访问self.__name = nameself.age = ageself.sex = sex@property #@property :修饰得函数,用来获取私有属性的值 类外部直接使用 obj.函数名 进行使用def value(self):return self.__name@value.setter #@value.setter :修饰value函数,用来设置私有属性的值 类外部直接使用 obj.函数名 = 数值 进行使用def value(self, name):self.__name = nameif __name__ == '__main__':obj = Demo("盲僧", 18, "女")print(obj.age, obj.sex)#普通的访问操作私有属性obj.value = "蛮王"print(obj.value)