大话Python类语义
类
物以类聚,人以群分,就是相同特征的人和事物会自动聚集在一起,核心驱动点就是具有相同特征或相类似的特征,我们把具有相同特征或相似特征的事物放在一起,被称为分类,把分类依据的特征称为类属性
计算机中分类的思想叫做面向对象,Python中把数据抽象成对象,通过对象或对象间的关系来描叙数据。
我们把一些相似事物的共同特征通过一个方式描叙出来,也就是说,你是按什么标准对事物进行分类,相似点是什么,计算机把对相似事物的特征数据进行描叙称为类定义
计算机中类的三大特征
1. 封装 对数据的可见性进行约束,分为公有public、私有private、非公有, 公有数据可以直接通过属性访问语法 obj.attr 直接访问,但是私有、非公有则通过方法进行访问,访问行为其实就是SQL中的增删改查,查称为读,增删改称为写,在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 33 34 35 36 | class Person: """数据封装实现""" def __init__( self , name, age, sex): """名字是公开的, 性别是非公有, 年龄是私有""" # 现在给实例插入数据 # 公有数据 self .name = name # 非公有使用一个下划线 self ._sex = sex # 私有变量使用两个下划线 self .__age = age def get_name( self ): """通过方法读取名称""" return self .name def set_age( self , value): """对年龄进行修改""" self .__age = = value def get_age( self ): """通过方法获取私有属性年龄""" return self .__age if __name__ = = '__main__' : # 类的实例话类似函数调用,也可以使用关键字参数和位置参数 p = Person( "北门吹雪" , 20 , "male" ) # 通过 obj.name 属性访问语言访问实例的属性,这个饭方法只能访问公有属性 print (p.name) # 通过方法修改年龄 p.set_age( 22 ) # 通过方法访问私有属性 print (p.get_age()) pass |
2. 继承 需要理清几个概念,父类、子类、基类、派生类,父类就是基类,子类就是派生类。继承是建立在类的基础上,子类完全继承父类的所有属性以及控制属性访问的方法。继承要理清差异共相同点,对依据对事物进行分类的特征要非常确定才能写计算机中的类,不然不是分类,分类的前提是公共特征,继承的前提是共性与差异,如果不理解共同特征你就无法分类,你不理解同一类的共性与差异你无法写出继承,继承强调的是公共特征,包括属性和方法
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 | class Human( object ): """定义人类, 每个人类都有名字和国家, 都会说话""" def __init__( self , name, country): self .name = name self .country = country def say( self , language): """交流说话""" print (f "{self.name} 能说 {language}" ) class Chinese(Human): """定义一个中国人,继承人类 Human被称为这个类的基类或这个类的父类,Chinese被成为Human的派生类""" def __init__( self , name, country, skin): """中国人和外国人最大的不同是肤色""" # 调用父类的构造函数 super (Chinese, self ).__init__(name, country) self .skin = skin if __name__ = = '__main__' : c = Chinese( "北门吹雪" , 20 , "yellow" ) print (c.skin) c.say( "中文" ) pass |
3. 多态 同一个行为具有不同表现形式或形态的能力,计算机中最接近多态的是接口interface,接口定义相同行为,然后我们对接口行为的分类,就产生所谓的抽象基类,通过继承机制,然后子类重写方法从而实现多态,说白了就是同一个方法中有不同的实现,再说漏骨一点就是函数的名称相同,函数的形参相同,函数的返回值相同,但是函数体内的语句逻辑不一样,这个函数体不同被称为多态。多态是建立在继承的基础上然后对方法进行重写,其实能重写(又称为重载)的只有函数体,多态强调的是方法
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | class HumanInterface( object ): """定义一个人类的抽象接口,用于实现多态, 多态强调的是方法 定义了两个接口,一个是吃 一个是说 """ def say( self , language): """说""" pass def eat( self , what): """吃""" pass class Chinese(HumanInterface): """定义一个中国人,继承人类""" def __init__( self , name, country): """中国人和外国人最大的不同是肤色""" # 调用父类的构造函数 self .name = name self .country = country def eat( self , what): """重载或重写 父类中的方法,实现多态""" print (f "{self.name} 正在吃{what}ing" ) pass def say( self , language): print (f "{self.name} 能说 {language}" ) pass class American(HumanInterface): """美国人""" def __init__( self , name, country): """中国人和外国人最大的不同是肤色""" # 调用父类的构造函数 self .name = name self .country = country def eat( self , what): """重载或重写 父类中的方法,实现多态""" print (f "{self.name}吃{what}再跳舞" ) pass def say( self , language): print (f "{self.name} 不仅能说 {language}, 还会其他国家语言" ) pass if __name__ = = '__main__' : c = Chinese( "北门吹雪" , "中国" ) a = American( "alex" , "美国" ) c.eat( "大米" ) a.eat( "汉堡包" ) c.say( "中文" ) a.say( "英语" ) # 你会发现他们方法名相同,但是输出不同,也就是形态不同 |
Python中类定义
类定义
1 2 | class Name: pass |
# 定义是可执行的语句,在被import语句导入或以main文件执行时,定义就会被执行
# 类定义的执行,首先会在当前作用域引入一个用于存储类中属性的命名空间。然后把这个类命名空间封装成对象返回,并把这个类对象绑定到class关键字指定的名称,这个名称又被绑定到class关键子所在的命名空间
# Name -> 类对象 > 类命名空间
# 其实类定义中包含的一般是函数定义,函数定义的第一个参数其实时实例本身,通过实例本身就可以访问实例中的数据属性和方法
类对象
# 支持两种操作:属性引用 和 实例化
# 属性引用使用Python标准属性引用语法 obj.name
# 实例化: 类的实例化,类似于函数调用,把括号里的参数传递给类的__init__方法,通过__init__方法为类的新实例初始化特定的属性,这个init方法又被称为工厂函数, 其他语言中的类通过new关键字创建。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 | class Person( object ): """人类""" # 能说话 can_say = True # 能吃 can_eat = True # 能睡觉 can_sleep = True def __init__( self , name, age, country): self .name = name self .__age = age self .country = country def show_country( self ): """显示国籍""" print (f "{self.name}的国籍是: {self.country}" ) if __name__ = = '__main__' : # 属性引用 print (Person.can_eat) print (Person.can_sleep) print (Person.can_sleep) # 实例化 c = Person( "北门吹雪" , 20 , "中国" ) |
实例对象
# 支持唯一的操作就是属性引用, 其实和普通的变量引用一样,只是多个归属前缀而已,通过方法对实例里的变量进行修改,实际上在函数封装过程的基础上再把数据和函数绑定起来
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 | class Person( object ): """人类""" # 能说话 can_say = True # 能吃 can_eat = True # 能睡觉 can_sleep = True def __init__( self , name, age, country): self .name = name self .__age = age self .country = country def show_country( self ): """显示国籍""" print (f "{self.name}的国籍是: {self.country}" ) def set_age( self , value): """修改年龄""" self .__age = value def get_age( self ): """获取年龄""" return self .__age if __name__ = = '__main__' : # 实例化 user = Person( "北门吹雪" , 20 , "中国" ) # 属性引用 user_age = user.get_age() print (user_age) # 设置年龄 user.set_age( 22 ) print (user.get_age()) |
方法对象
# 方法是从属某个对象的函数,类中的函数定义了类的实例所拥有的方法,也就是说对象的类型决定了对象支持的操作
# 方法对比函数,函数定义在模块或函数中,方法定义在类定义中,方法的第一个参数固定时实例对象
类和实例变量
# 实例变量是每个实例的唯一数据,而类变量是该类的所有实例共享的属性和方法
# 相同属性名称出现在类和实例中,首先被找到的时实例属性
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 Person( object ): """人类""" # 该类被实例化多少次 object_count = 0 # 默认全球通用语言是英语 language = "En" def __init__( self , name, age, country, language): self .name = name self .__age = age self .country = country self .language = language def show_country( self ): """显示国籍""" print (f "{self.name}的国籍是: {self.country}" ) def set_age( self , value): """修改年龄""" self .__age = value def get_age( self ): """获取年龄""" return self .__age @classmethod def add_obj( cls ): cls .object_count + = 1 if __name__ = = '__main__' : # 实例化 user = Person( "北门吹雪" , 20 , "中国" , "Cn" ) # 实例化一次则类变量增加一次 Person.add_obj() user_two = Person( "alex" , 30 , "美国" , "En" ) Person.add_obj() # 打印被实例化几次 print (Person.object_count) # 类变量和属性同名访问,优先选择实例 print (user.language) |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版