这里介绍Python的面向对象——如何定义类
定义类 这里定义一个Dog类,示例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 class Dog : """ 狗 """ remark = "备注:警犬" def __init__ (self, name, age, type ="拉布拉多" ): self.name = name self.age = age self.sex = "male" self.__type = type def say (self ): print (self.name, "正在狗叫: 汪汪汪" ) self.__bye() def info (self ): print ("I'm" , self.name, "Age is" , self.age, "Sex: " , self.sex, "Type: " , self.__type ) def update_sex (self, sex ): self.sex = sex def __bye (self ): print ("Bye ~~~~" ) @classmethod def get_remark_info (cls ): print ("我是类方法, remark:" , cls.remark, ", cls:" , cls) @staticmethod def get_remark (msg ): print ("我是静态方法, remark:" , Dog.remark, ", msg:" ,msg)
构造方法/实例方法 构造方法:Python中,一个类只能有一个构造方法,用于创建实例。如果期望实现多个构造方法,可通过为形参添加默认值的方式实现。具体地,通过特殊方法名 __init__ 进行定义构造方法。其会在对象实例化时自动调用
实例方法:其第一个形参必须为实例对象本身,该形参名习惯上使用self。我们通过实例对象调用实例方法时,不需要为self参数提供实参,Python会自动传入
1 2 3 4 5 6 7 8 9 10 11 12 title = "调用实例方法" print (f"------------ {title} -------------------" )my_dog = Dog("Luca" , 3 ) his_dog = Dog("Tony" , 17 , "藏獒" ) my_dog.say() my_dog.info() his_dog.say() his_dog.info()
实例变量 对于实例变量,在类内部(即类的定义中)通过self . 变量名访问;在类外部可通过实例名 . 变量名访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 title = "访问/修改 实例变量" print (f"------------ {title} -------------------" )my_dog = Dog("Luca" , 3 ) his_dog = Dog("Tony" , 17 , "藏獒" ) print ("My Dog is" , my_dog.name)print ("My Dog age is" , my_dog.age)print ("My Dog sex is" , my_dog.sex)his_dog.name = "Tonnnnnnnnnny" his_dog.update_sex("female" ) print ("His Dog is" , his_dog.name)print ("His Dog age is" , his_dog.age)print ("His Dog sex is" , his_dog.sex)
类变量 对于类变量,在类内部(即类的定义中)通过类名 . 变量名访问;在类外部可通过类名 . 变量名访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 title = "访问/修改 类变量" print (f"------------ {title} -------------------" )my_dog = Dog("Luca" , 3 ) his_dog = Dog("Tony" , 17 , "藏獒" ) print (f"Dog.remark: {Dog.remark} " )Dog.remark = "备注:宠物犬" print (f"Dog.remark: {Dog.remark} " )Dog.remark = "备注:中华田园犬" print (f"Dog.remark: {Dog.remark} " )
私有变量/私有方法 Python中,以双下划线__开头的变量为私有变量,以双下划线__开头的方法为私有方法。在类外部不可以访问私有变量/私有方法。但事实上可以通过特殊手段进行访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 title = "私有变量/私有方法" print (f"------------ {title} -------------------" )my_dog = Dog("Luca" , 3 ) his_dog = Dog("Tony" , 17 , "藏獒" ) try : print ("my dog type:" , my_dog.__type ) except Exception as e: print ("访问私有变量, 发生异常:" , e) my_dog.__type = "中华田园犬" my_dog.info() print ("his dog type: " , his_dog._Dog__type)his_dog._Dog__type = "金毛" his_dog.info() print ("------------------------------------------------------------------" )try : my_dog.__bye() except Exception as e: print ("调用私有方法, 发生异常:" , e) his_dog._Dog__bye()
类方法 定义类的类方法时,需要添加 @classmethod装饰器 表示其为类方法。对于类方法而言,其第一个形参必须为类本身,该形参名习惯上使用cls。可通过类/实例 来调用类方法,调用时,不需要为cls参数提供实参,Python均会自动传入类本身
1 2 3 4 5 6 7 8 9 title = "调用类方法" print (f"------------ {title} -------------------" )Dog.get_remark_info() dog2 = Dog("Tom" , 3 ) dog2.get_remark_info()
静态方法 定义类的静态方法时,需要添加 @staticmethod装饰器 表示其为静态方法, 可通过类/实例 进行调用。本质上就是一个普通函数,只是将其放置在类中了。通常是一些工具方法
1 2 3 4 5 6 7 8 9 title = "调用静态方法" print (f"------------ {title} -------------------" )Dog.get_remark("嘻嘻" ) dog1 = Dog("Caily" , 22 ) dog1.get_remark("嘿嘿" )
参考文献
Python编程·第3版:从入门到实践 Eric Matthes著
Python基础教程·第3版 Magnus Lie Hetland著
流畅的Python·第1版 Luciano Ramalho著