免费网站建设ppt模板,汕头八景,网页游戏大全双人,济南网站托管运营概述 在上一节#xff0c;我们介绍了Python的函数#xff0c;包括#xff1a;函数的定义、函数的调用、参数的传递、lambda函数等内容。在本节中#xff0c;我们将介绍Python的面向对象编程。面向对象编程#xff08;Object-Oriented Programming, 即OOP#xff09;是一种…概述 在上一节我们介绍了Python的函数包括函数的定义、函数的调用、参数的传递、lambda函数等内容。在本节中我们将介绍Python的面向对象编程。面向对象编程Object-Oriented Programming, 即OOP是一种编程范型它以对象为基础将数据和操作封装在一个类Class中。在Python中类是一种定义对象结构和行为的模板而对象则是类的实例。类定义了一个新的类型用于创建具有特定属性和方法的对象。类是面向对象编程的核心它允许程序员使用对象来组织代码和复用代码。 类的定义
在Python中类的基本语法如下
class ClassName:# class attributeclass_variable class variabledef __init__(self, arg1, arg2):# instance variableself.instance_variable arg1 arg2# instance methoddef instance_method(self):print(I am an instance method)# class methodclassmethoddef class_method(cls):print(I am a class method)# static methodstaticmethoddef static_method():print(I am a static method) 下面逐一介绍上面示例代码中的各个元素。 class ClassName这是类定义的开始以class关键字作为开头ClassName是要定义的类的名称最后面是冒号冒号后面的内容需要缩进。 class_variable class variable这是类变量它是一个在类中定义的全局变量所有实例共享同一个变量。 def __init__(self, arg1, arg2)这是类的构造函数当一个类实例被创建时会自动调用。在这个例子中构造函数接受两个参数arg1和arg2。self是对当前实例的引用调用时不需要写由系统自动填入。构造函数可以不带参数也可以带一个或多个参数。 self.instance_variable arg1 arg2这是一个实例变量每个实例都有自己独立的实例变量。在这个例子中实例变量是arg1和arg2的和。 def instance_method(self)这是一个实例方法它需要一个实例作为其第一个参数通常命名为self也可以使用其他名称。self是对当前实例的引用调用时不需要写由系统自动填入。 classmethod这是一个类方法装饰器标识后面是一个类方法。它不需要实例作为其第一个参数而是使用类名本身作为第一个参数通常命名为cls也可以使用其他名称。cls是对当前类的引用调用时不需要写由系统自动填入。 staticmethod这是一个静态方法装饰器标识后面是一个静态方法。它不需要实例或类作为其参数。 类的使用 定义好类之后我们就可以实例化该类的对象并调用其属性和方法了。
class Person:def __init__(self, name, age):self.name nameself.age agedef show_info(self):print(fname is {self.name}, {self.age} years old)staticmethoddef show_skill():print(walk, run, swim)# 创建一个Person类的实例
person1 Person(xiaoxiao, 20)
# 访问实例变量输出xiaoxiao 20
print(person1.name, person1.age)
# 访问实例方法输出name is xiaoxiao, 20 years old
person1.show_info()
# 访问静态方法输出walk, run, swim
person1.show_skill()
Person.show_skill() 可以看到访问实例变量和实例方法时必须使用实例对象。访问静态方法时既可以使用实例对象也可以使用类名。 类的__init__方法是类的构造函数当一个类实例被创建时会自动调用。同样的类的__del__方法是类的析构函数在释放实例对象时也会被自动调用。
class Animal:def __init__(self, name):self.name nameprint(fanimal {name} constructed)def __del__(self):print(fanimal {self.name} destructed)def show(self):print(f{self.name} is preset)def test():animal Animal(seagull)animal.show() test作用域结束时animal会销毁故依次输出
animal seagull constructed
seagull is preset
animal seagull destructedtest() 类变量和实例变量 类变量是在类的所有实例中共享的变量这就意味着如果你改变了一个类变量的值那么这个改变将影响到类的所有实例。类变量在类定义时声明通常在类的方法中使用。
class MyClass: # 类变量 class_variable 0 def __init__(self, instance_variable): self.instance_variable instance_variable MyClass.class_variable self.instance_variable 100 instance1 MyClass(66)
# 输出166
print(MyClass.class_variable)instance2 MyClass(88)
# 均输出188
print(MyClass.class_variable)
print(instance1.class_variable)
print(instance2.class_variable) 在上面的示例代码中class_variable是一个类变量它被所有实例共享。每次创建一个新的实例时都会改变class_variable的值。因此当创建了instance2并给它一个值为88的参数时class_variable的值就从166变成了188。 实例变量是在类的每个实例中单独存储的变量这就意味着如果你改变了一个实例的状态那么这个改变只影响那个特定的实例。实例变量在类的__init__方法中声明通常在实例的方法中使用。
class MyClass:def __init__(self, instance_variable):# 实例变量self.instance_variable instance_variable instance1 MyClass(66)
# 输出66
print(instance1.instance_variable)# 创建实例2
instance2 MyClass(88)
# 输出88
print(instance2.instance_variable)
# 输出66
print(instance1.instance_variable)# 改变实例1的实例变量值
instance1.instance_variable 100
# 输出100
print(instance1.instance_variable)
# 输出88
print(instance2.instance_variable) 在上面的示例代码中instance_variable是一个实例变量每个实例都有它自己的副本。当你改变instance1的 instance_variable值时instance2的值不会受到影响。 在Python中两个下划线开头的属性被声明为私有属性不能在类的外部被使用或直接访问。否则运行时会报AttributeError的错误信息。
class MyNumber:def __init__(self, value):self.__value valuenum MyNumber(66)
# 访问私有属性运行时报错MyNumber object has no attribute __value
print(num.__value) 实例方法、类方法和静态方法 实例方法是定义在类中的普通函数它需要一个实例作为第一个参数通常命名为self。实例方法只能通过类的实例来调用可以访问类变量和实例变量。 类方法是定义在类中的普通函数它需要一个类作为第一个参数通常命名为cls。类方法可以通过类和类的实例来调用只能访问类变量不能访问实例变量。在定义类方法时可以使用classmethod装饰器进行声明。 静态方法是定义在类中的普通函数它不需要任何参数包括 self。静态方法可以通过类和类的实例来调用不可以访问类变量和实例变量。在定义静态方法时可以使用staticmethod装饰器进行声明。
class Person:# 类变量skills: [walk, run, swim]def __init__(self, name, age):# 示例变量self.name nameself.age age# 实例方法可以访问类变量和实例变量def show_info(self):print(fname is {self.name}, {self.age} years old)print(self.skills)# 类方法可以访问类变量classmethoddef show_skill(cls):print(cls.skills)# 静态方法不可以访问类变量和实例变量staticmethoddef show_basic():print(a person here) 在Python中两个下划线开头的方法被声明为私有方法不能在类的外部被使用或直接访问。否则运行时会报AttributeError的错误信息。
class MyNumber:def __init__(self, value):self.__value valuedef __show(self):print(self.__value)num MyNumber(66)
# 访问私有属性运行时报错MyNumber object has no attribute __show
num.__show() 与C、Java等语言不同Python不支持函数重载。当类的定义中有多个同名的函数时将以最后一个声明的函数为准。
class MyNumber:def __init__(self, value):self.__value valuedef show(self):print(self.__value)def show(self, a):print(self.__value, a)num MyNumber(100)
num.show(66)
# 运行时报错MyNumber.show() missing 1 required positional argument: a
num.show() 类的运算符重载 可以通过定义特定方法来重载类对象的运算符以下是一些常见的运算符重载方法。 __add__(self, other)重载加法运算符 用于实现两个对象的相加。 __sub__(self, other)重载减法运算符 -用于实现两个对象的相减。 __mul__(self, other)重载乘法运算符 *用于实现两个对象的相乘。 __truediv__(self, other)重载除法运算符 /用于实现两个对象的相除。 __floordiv__(self, other)重载整数除法运算符 //用于实现两个对象的整数相除。 __mod__(self, other)重载取模运算符 %用于实现两个对象的取模运算。 __pow__(self, other)重载幂运算运算符 **用于实现两个对象的幂运算。 __eq__(self, other)重载相等运算符 用于判断两个对象是否相等。 __ne__(self, other)重载不等运算符 !用于判断两个对象是否不相等。 __lt__(self, other)重载小于运算符 用于判断两个对象是否小于。 __le__(self, other)重载小于等于运算符 用于判断两个对象是否小于等于。 __gt__(self, other)重载大于运算符 用于判断两个对象是否大于。 __ge__(self, other)重载大于等于运算符 用于判断两个对象是否大于等于。 假如我们定义了一个名为MyNumber的类可以按照以下方式重载加法运算符。
class MyNumber:def __init__(self, value):self.value valuedef __add__(self, other):if isinstance(other, MyNumber):return MyNumber(self.value other.value)return MyNumber(self.value other)num1 MyNumber(100)
num2 MyNumber(200)
num num1 num2
# 输出300
print(num.value) 继承 继承是一种实现面向对象编程的重要机制它允许我们基于已有的类创建新的类从而继承已有类的属性和方法。在Python中使用class语句定义一个类时可以在类名后面使用(base_classes)的形式指定该类要继承的父类。base_classes可以为一个类也可以为多个类。多个类时各个类之间用逗号进行分隔属于多重继承的内容。
class Animal:def __init__(self, name):self.name namedef eat(self):print(self.name is eating...)class Dog(Animal):def __init__(self, name, breed):super().__init__(name)self.breed breeddog Dog(Sky, Corgi)
# 输出Sky is eating...
dog.eat()
# 输出Corgi
print(dog.breed) 在上面的示例代码中Dog类继承了Animal类因此Dog类具有了Animal类的属性和方法。在Dog类的定义中我们可以通过调用super().__init__(name)来调用父类的构造函数从而初始化Dog类实例的name属性。 除了继承父类的属性和方法子类还可以重写父类的方法从而实现对父类行为的修改。
class Animal:def __init__(self, name):self.name namedef eat(self):print(self.name is eating...)class Dog(Animal):def __init__(self, name, breed):super().__init__(name)self.breed breeddef eat(self):print(self.breed eats more)dog Dog(Sky, Corgi)
# 覆盖父类方法输出Corgi eats more
dog.eat()
# 强制调用父类方法输出Sky is eating...
super(Dog, dog).eat() 在上面的示例代码中我们直接在Dog类中定义了一个与父类同名的eat方法从而完全覆盖了父类的行为。如果想强制调用父类的方法可以使用类似super(Dog, dog)的方式获得父类的实例再调用父类的方法。
文章转载自: http://www.morning.blxlf.cn.gov.cn.blxlf.cn http://www.morning.bmncq.cn.gov.cn.bmncq.cn http://www.morning.wmqrn.cn.gov.cn.wmqrn.cn http://www.morning.rjljb.cn.gov.cn.rjljb.cn http://www.morning.llqch.cn.gov.cn.llqch.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.pbsqr.cn.gov.cn.pbsqr.cn http://www.morning.dgpxp.cn.gov.cn.dgpxp.cn http://www.morning.hmbtb.cn.gov.cn.hmbtb.cn http://www.morning.frzdt.cn.gov.cn.frzdt.cn http://www.morning.ljxxl.cn.gov.cn.ljxxl.cn http://www.morning.rxxdk.cn.gov.cn.rxxdk.cn http://www.morning.wsnbg.cn.gov.cn.wsnbg.cn http://www.morning.vvbsxm.cn.gov.cn.vvbsxm.cn http://www.morning.zcqbx.cn.gov.cn.zcqbx.cn http://www.morning.crkhd.cn.gov.cn.crkhd.cn http://www.morning.cwcdr.cn.gov.cn.cwcdr.cn http://www.morning.pjxw.cn.gov.cn.pjxw.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.smpmn.cn.gov.cn.smpmn.cn http://www.morning.epeij.cn.gov.cn.epeij.cn http://www.morning.xhhzn.cn.gov.cn.xhhzn.cn http://www.morning.mrskk.cn.gov.cn.mrskk.cn http://www.morning.zpfqh.cn.gov.cn.zpfqh.cn http://www.morning.rqgq.cn.gov.cn.rqgq.cn http://www.morning.pmxw.cn.gov.cn.pmxw.cn http://www.morning.wzknt.cn.gov.cn.wzknt.cn http://www.morning.lqws.cn.gov.cn.lqws.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.zhmgcreativeeducation.cn.gov.cn.zhmgcreativeeducation.cn http://www.morning.rybr.cn.gov.cn.rybr.cn http://www.morning.qxnns.cn.gov.cn.qxnns.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.qphdp.cn.gov.cn.qphdp.cn http://www.morning.drcnf.cn.gov.cn.drcnf.cn http://www.morning.zttjs.cn.gov.cn.zttjs.cn http://www.morning.yqgny.cn.gov.cn.yqgny.cn http://www.morning.rrms.cn.gov.cn.rrms.cn http://www.morning.dwgcx.cn.gov.cn.dwgcx.cn http://www.morning.mwjwy.cn.gov.cn.mwjwy.cn http://www.morning.gxwyr.cn.gov.cn.gxwyr.cn http://www.morning.kklwz.cn.gov.cn.kklwz.cn http://www.morning.pshpx.cn.gov.cn.pshpx.cn http://www.morning.prmyx.cn.gov.cn.prmyx.cn http://www.morning.rqjxc.cn.gov.cn.rqjxc.cn http://www.morning.smpmn.cn.gov.cn.smpmn.cn http://www.morning.fqmcc.cn.gov.cn.fqmcc.cn http://www.morning.lsyk.cn.gov.cn.lsyk.cn http://www.morning.benqc.com.gov.cn.benqc.com http://www.morning.dlhxj.cn.gov.cn.dlhxj.cn http://www.morning.jxjrm.cn.gov.cn.jxjrm.cn http://www.morning.lnrr.cn.gov.cn.lnrr.cn http://www.morning.rpzth.cn.gov.cn.rpzth.cn http://www.morning.frtb.cn.gov.cn.frtb.cn http://www.morning.rycbz.cn.gov.cn.rycbz.cn http://www.morning.cbczs.cn.gov.cn.cbczs.cn http://www.morning.wqbfd.cn.gov.cn.wqbfd.cn http://www.morning.glxmf.cn.gov.cn.glxmf.cn http://www.morning.bbxbh.cn.gov.cn.bbxbh.cn http://www.morning.yfcbf.cn.gov.cn.yfcbf.cn http://www.morning.wmpw.cn.gov.cn.wmpw.cn http://www.morning.fbbmg.cn.gov.cn.fbbmg.cn http://www.morning.bwkzn.cn.gov.cn.bwkzn.cn http://www.morning.kqpxb.cn.gov.cn.kqpxb.cn http://www.morning.gtmdq.cn.gov.cn.gtmdq.cn http://www.morning.bdtpd.cn.gov.cn.bdtpd.cn http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn http://www.morning.tcylt.cn.gov.cn.tcylt.cn http://www.morning.pgzgy.cn.gov.cn.pgzgy.cn http://www.morning.tbwsl.cn.gov.cn.tbwsl.cn http://www.morning.lrnfn.cn.gov.cn.lrnfn.cn http://www.morning.fssjw.cn.gov.cn.fssjw.cn http://www.morning.lgxzj.cn.gov.cn.lgxzj.cn http://www.morning.mbpfk.cn.gov.cn.mbpfk.cn http://www.morning.yfqhc.cn.gov.cn.yfqhc.cn http://www.morning.dschz.cn.gov.cn.dschz.cn http://www.morning.rnzwh.cn.gov.cn.rnzwh.cn http://www.morning.rjtmg.cn.gov.cn.rjtmg.cn http://www.morning.wdykx.cn.gov.cn.wdykx.cn http://www.morning.pwhjr.cn.gov.cn.pwhjr.cn