014 Python语法之类与对象
类与对象
类
class Person:def __init__(self):self.name = "Luo"self.mystr = "任你千般芳华万般妖娆,我只问一句,可解Bug否?"def work(self):print("生命不息,奋斗不止!")p1 = Person()
print(p1.name)
print(p1.mystr)
p1.work()
类的定义与结构
class 类名:def __init__(self, 形参1, 形参2):self.属性1 = 形参1self.属性2 = 形参2def __del__(self):pass
类的介绍
- class关键字修饰类
- init方法用于类的初始化自动调用
- del方法(析构函数)用于类被销毁时自动调用
类的权限设计
class Bank:def __init__(self, money, yearRate, year):self.__money = moneyself.__yearRate = yearRatedef __getRateMoney(self):return self.money * (1 + self.yearRate)**yeardef getMoney(self):self.__getRateMoney()bank = Bank(10000, 0.04, 10)
bank.getmoney()
类的权限设计注意点
- 加上双下划线,变量和方法就变成私有的了,外部不能直接访问
- 私有变量和方法可通过 对象._类名__变量名访问
类内部访问私有变量的方式
class Circle:def __init__(self, radius):self.__radius = radiusdef getRadius(self):return self.__radius这里外部不能访问 __radius 属性
c1 = Circle(5)
c1.__radius 和 c1.radius 都不能访问到 radius 这个私有变量
-----------------------
下面这种方式才能访问私有变量
c1.getRadius()这个能访问到 self.__radius 这个私有变量的值
类外部访问私有变量的方式
1. Python私有变量在类内部的命名特性,根据 name mangling 技术,
2. 私有变量的名字都会变成(_类名__变量名)的形式class Circle:def __init__(self, radius):self.__radius = radiusdef getRadius(self):return self.__radiusc1 = Circle(5)
c1._Circle__radius 这个能访问到 self.__radius
实例变量(类修改变量值不会对实例变量产生影响)
- 一个类修改实例变量不会影响该类创建时候该类实例变量的值
类变量(类修改变量的值会影响类实例调用该变量的值)
- 类也会创建一个实例,每次创建一个对象时都会从类中拷贝类的所有状态
- 如果在创建一个类之前通过类名修改了类的不可变变量的值,创建的实例中的值也会相应的改变,但是实例变量修改不会影响类变量
- 如果在创建一个类之前通过类名修改了类的可变变量的值,创建的实例中的值也会相应的改变,但是实例变量修改会影响类变量
继承
- 儿子的属性和方法会覆盖父亲类
- 儿子类继承所有父类非私有方法和属性
- 儿子想自己也拥有自己的属性需要调用父类的init方法
继承的格式
class 类1(类2):pass
继承的用法
class Person:def __init__(self):self.name = "Luo"self.mystr = "任你千般芳华万般妖娆,我只问一句,可解Bug否?"def work(self):print("生命不息,奋斗不止!")class Luo(Person):passluo1 = Luo()
print(luo1.name)
print(luo1.mystr)
luo1.work()
经典类与新式类
class People: 经典类写法passclass Man: def __init__(self,name,age):People.__init__(self,name,age) 经典类写法class People(object): 新式类的写法def __init__(self,name,age):super(Man,self).__init__(name,age) 新式类的写法
Python2/3中经典类与新式类继承方式
- py2中经典类时按照深度优先来继承的,新式类时按照广度优先来继承的
- py3中经典类与新式类都是统一按照广度优先来继承的
多继承
- 多继承情况下,如果该类想拥有自己的属性,那么必须用类名去分别调用init方法
- 属性后面调用的init覆盖前面调用的(后覆盖前)
- 方法会前者覆盖后者
多继承用的场合
- 同时要用到多个类的功能就需要多继承
继承的局限性
- 无法拿到父类的私有方法与属性(通过父类名还是能拿到)
类的一般属性
- doc:类的说明(类似文档注释)
- name:类的名字
- module:从哪开始执行的
- bases:类的多个父类
- base:类的单个父类
- dict:类全部信息,以字典的形式
- class:当前类的类型
super关键字
- 父类少初始化,节省内存
多态接口
class F:def show(self):print("F Show")class A(F):def show(self):print("A Show")class B(F):def show(self):print("B Show")def Fun(C):C.show()a = A()
b = B()
Fun(a)
Fun(b)--------------------------------
class Animal:def __init__(self, name):self.name = namedef talk(self):pass@staticmethoddef animal_talk(obj):'''接口'''obj.talk()class Cat(Animal):def talk(self):print('Meow!')class Dog(Animal):def talk(self):print('Woof! Woof!')d = Dog("D1")c = Cat("C1")Animal.animal_talk(c)
Animal.animal_talk(d)
多态介绍
- 因为Python定义参数不需要数据类型,所以在Python中用方法当做接口去实现多态
- 为了解决不同对象的各种需求,接口就应运而生了
类的动态绑定属性和方法
- 类可以在对象创建时动态添加属性和方法
- 动态添加的属性和方法只在当前对象有用,对其他对象无影响
动态添加属性
class XiaoA:passxiaoA = XiaoA()
xiaoA.女神的备胎数量 = 99 # 动态添加的
动态添加方法
class XiaoA:def __init__(self):self.女神的备胎数量 = 99def 中奖(self):self.女神的备胎数量 = 0xiaoA = XiaoA()
xiaoA.中奖 = types.MethodType(中奖, xiaoA)
xiaoA.中奖()
print(xiaoA.女神的备胎数量) --> 0
类的属性动态操作
判断当前对象是否有某属性
hasattr(对象,"属性名")
设置当前对象的属性(有该属性就覆盖值)
setattr(对象, "属性名", 设置值)
读取属性的细节
- 如果有该属性就返回该属性值,没有就返回默认值
读取这个对象的属性
getattr(对象, "属性名", 默认值)
读取属性的细节
- 如果有该属性就返回该属性值,没有就返回默认值
类的方法动态操作
判断当前对象是否有某方法
hasattr(对象,"方法名")
设置当前对象的方法(有该属性就覆盖值)
class XiaoA:def __init__(self):self.女神的备胎数量 = 99def 中奖(self):self.女神的备胎数量 = 0xiaoA = XiaoA()
xiaoA.中奖 = types.MethodType(中奖, xiaoA)
xiaoA.中奖()
print(xiaoA.女神的备胎数量) --> 0
读取方法的细节
- 如果有该方法就返回该方法
读取这个对象的属性
getattr(对象, "属性名", 默认值)
对象属性方法与类属性方法
class XiaoA:def __init__(self):self.女神的备胎数量 = 99 # 类属性xiaoA.name = "xiaoB" # 对象属性
限制属性(只能操作和使用限制的属性)
class XiaoA:__slots__ = ("name", "love")xiaoA = XiaoA()
xiaoA.name="xiaoA"
xiaoA.love = "xiaoB"
xiaoA.loveother = "aaa" # 会报错
类方法与静态方法和属性方法
class XiaoA:@classmethoddef love(self):self.name=
类方法介绍
- @classmethod修饰的方法是类方法
- 类方法可以用类名调用,也可以用对象调用
- 类方法无法覆盖类属性,可以在这里初始化
- 必须加上self
- 只能访问类变量,不能访问实例变量
静态方法
- 静态方法实际上和类没有关系了,仅仅只要类名调用
- @staticmethod修饰的方法是静态方法
- 静态方法可以用类名调用,也可以用对象调用
- 参数可以不带self
- 作用一般多态会用到,或者一个工具类集合
静态方法与类方法的对比
- 不用加self,其他差不多
属性方法property(类似Java中get/set方法)
- 把一个方法变成一个属性,然后像属性一样用,不用加括号调用
- 屏蔽信息获取解析过程,只暴露结果
静态方法
class Dog(object):def __init__(self,name):self.name = name@staticmethod #实际上跟类没什么关系了def eat(self):print("%s is eating %s" %(self.name,'dd'))def talk(self):print("%s is talking"% self.name)
d = Dog("ChenRonghua")
d.eat(d)
d.talk()
类方法
class Dog(object):#n = 333#name = "huazai"def __init__(self,name):self.name = name#self.n = 333#@staticmethod #实际上跟类没什么关系了@classmethoddef eat(self):print("%s is eating %s" %(self.name,'dd'))def talk(self):print("%s is talking"% self.name)d = Dog("ChenRonghua")
d.eat()
属性方法
class Flight(object):def __init__(self,name):self.flight_name = namedef checking_status(self):print("checking flight %s status " % self.flight_name)return 0@propertydef flight_status(self):status = self.checking_status()if status == 0 :print("flight got canceled...")elif status == 1 :print("flight is arrived...")elif status == 2:print("flight has departured already...")else:print("cannot confirm the flight status...,please check later")@flight_status.setterdef flight_status(self,status):print("flight %s has changed status to %s" %(self.flight_name,status))@flight_status.deleterdef flight_status(self):del self.flight_namef = Flight("CA980")
f.flight_status
f.flight_status = 2
枚举类
import enum # 枚举@enum.unique
class 象棋(enum.Enum):帅=1000 # 无需排序车=10马=5炮=5
枚举类的介绍
- 象棋.帅.value # 象棋.帅的值
- 象棋.帅.name # 象棋.帅的名字
动态创建类
def show(self,name):print("我是", name)# A是类的名字,(object父类) dict字典
A = type("A", (object,), dict(showname = show))a = A() # 初始化
a.showname("Luo") # 调用了show方法
print(type(A)) # type类型:动态类型
print(type(a)) # A类型,两个A可以不一样
动态创建类第二版
def func(self):print("hello %s"%self.name)def __init__(self,name,age):self.name = nameself.age = ageFoo = type("Foo",(object,), {"talk":func,"__init__":__init__})
f = Foo("Luo",22)
f.talk()
014 Python语法之类与对象相关推荐
- python语法学习之对象与参考,局部与全局变量
对象与参考:当你创建一个对象并给它赋一个变量的时候,这个变量仅仅参考那个对象,而不是表示这个对象本身. 也就是说,变量名指向你计算机中存储那个对象的内存(指向同一个内存单元).这被称作名称到对象的绑定 ...
- Python 语法小知识
为什么80%的码农都做不了架构师?>>> 序列解包 将含有多个值的序列解开,然后把值存放到变量中,当函数或者方法返回元组时这个特性很有用,可以把返回的序列值直接赋值 ...
- python语法书籍推荐_python语法的书
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 四大基本语法分别从变量命名规则.缩进原则.特殊关键字和特殊运算符四个方面,总结 ...
- python语法错误概述_python语法错误
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我是python中的新手,当我想在模块中编译代码时,我遇到语法错误:invail ...
- python提供两个对象身份比较操作符什么和什么来测试_python - 第二部分
python 总结 >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. E ...
- 人工智能实践:TensorFlow笔记学习(二)—— Python语法串讲
Python语法串讲 大纲 2.1 Linux指令.HelloWorld 2.2 列表.元组.字典 2.3 条件语句 2.4 循环语句 2.5 turtle模块 2.6 函数.模块.包 2.7 类. ...
- python基本语法语句-python 语法基础篇 一
安装篇 编辑篇: 编辑python 一 : 在终端环境下输入python命令,回车键运行.这种方式称为 交互方式. 1️⃣ 打开终端: 2️⃣ 输入python 回车 3️⃣ 输入python 语法 ...
- python语法手册-python语法手册
广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 常用的也不超过十个,这种相对于更为复杂的html标记语言来说,markdown可谓 ...
- python语法教程-Python语法教程总结规范
Python语法易错点记录 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar-- 心分享.心 ...
最新文章
- 英国拟在其国内建立一套互联网过滤网
- 讲给普通人听的分布式数据存储
- vector机器人 HOW TO CHARGE VECTOR 如何给矢量充电
- 自下而上归并排序 数组实现
- SAP UI5 jQuery.sap.includeStyleSheet
- tomcat源码阅读之StandardHost和StandardEngine
- 【渝粤题库】国家开放大学2021春3608矿井水害防治题目
- 重命名 docker 容器名
- 单片机复位电路电容一定用电解电容_学好单片机必须了解的10个电路
- 如何使用confd+ACM管理Nginx配置
- phpcms内容页 调用 上一级栏目id,catname等信息 - 代码篇
- 小米bl未解锁变砖了如何刷机_如何安装MIUI 10
- 饿了么“多等5分钟”后,美团外卖宣布给骑手留出8分钟...
- ScaleAnimation缩放动画Demo
- [Python可视化] pyecharts安装入门及绘制中国贵州地图
- 文本分类(三) | (6) 番外篇(预训练语言模型的另一种使用方式)
- 【计算机网络】实验1:双绞线制作
- 网络性能指标及测试方法
- 在centos中运行出现错误:cannot find -lbz2
- 产品经理如何营销自己