类与对象

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

类的介绍

  1. class关键字修饰类
  2. init方法用于类的初始化自动调用
  3. 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()

类的权限设计注意点

  1. 加上双下划线,变量和方法就变成私有的了,外部不能直接访问
  2. 私有变量和方法可通过 对象._类名__变量名访问

类内部访问私有变量的方式

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

实例变量(类修改变量值不会对实例变量产生影响)

  1. 一个类修改实例变量不会影响该类创建时候该类实例变量的值

类变量(类修改变量的值会影响类实例调用该变量的值)

  1. 类也会创建一个实例,每次创建一个对象时都会从类中拷贝类的所有状态
  2. 如果在创建一个类之前通过类名修改了类的不可变变量的值,创建的实例中的值也会相应的改变,但是实例变量修改不会影响类变量
  3. 如果在创建一个类之前通过类名修改了类的可变变量的值,创建的实例中的值也会相应的改变,但是实例变量修改会影响类变量

继承

  1. 儿子的属性和方法会覆盖父亲类
  2. 儿子类继承所有父类非私有方法和属性
  3. 儿子想自己也拥有自己的属性需要调用父类的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中经典类与新式类继承方式

  1. py2中经典类时按照深度优先来继承的,新式类时按照广度优先来继承的
  2. py3中经典类与新式类都是统一按照广度优先来继承的

多继承

  1. 多继承情况下,如果该类想拥有自己的属性,那么必须用类名去分别调用init方法
  2. 属性后面调用的init覆盖前面调用的(后覆盖前)
  3. 方法会前者覆盖后者

多继承用的场合

  1. 同时要用到多个类的功能就需要多继承

继承的局限性

  1. 无法拿到父类的私有方法与属性(通过父类名还是能拿到)

类的一般属性

  1. doc:类的说明(类似文档注释)
  2. name:类的名字
  3. module:从哪开始执行的
  4. bases:类的多个父类
  5. base:类的单个父类
  6. dict:类全部信息,以字典的形式
  7. class:当前类的类型

super关键字

  1. 父类少初始化,节省内存

多态接口

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)

多态介绍

  1. 因为Python定义参数不需要数据类型,所以在Python中用方法当做接口去实现多态
  2. 为了解决不同对象的各种需求,接口就应运而生了

类的动态绑定属性和方法

  1. 类可以在对象创建时动态添加属性和方法
  2. 动态添加的属性和方法只在当前对象有用,对其他对象无影响

动态添加属性

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(对象, "属性名", 设置值)
读取属性的细节
  1. 如果有该属性就返回该属性值,没有就返回默认值

读取这个对象的属性

getattr(对象, "属性名", 默认值)
读取属性的细节
  1. 如果有该属性就返回该属性值,没有就返回默认值

类的方法动态操作

判断当前对象是否有某方法

hasattr(对象,"方法名")

设置当前对象的方法(有该属性就覆盖值)

class XiaoA:def __init__(self):self.女神的备胎数量 = 99def 中奖(self):self.女神的备胎数量 = 0xiaoA = XiaoA()
xiaoA.中奖 = types.MethodType(中奖, xiaoA)
xiaoA.中奖()
print(xiaoA.女神的备胎数量) --> 0
读取方法的细节
  1. 如果有该方法就返回该方法

读取这个对象的属性

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=

类方法介绍

  1. @classmethod修饰的方法是类方法
  2. 类方法可以用类名调用,也可以用对象调用
  3. 类方法无法覆盖类属性,可以在这里初始化
  4. 必须加上self
  5. 只能访问类变量,不能访问实例变量

静态方法

  1. 静态方法实际上和类没有关系了,仅仅只要类名调用
  2. @staticmethod修饰的方法是静态方法
  3. 静态方法可以用类名调用,也可以用对象调用
  4. 参数可以不带self
  5. 作用一般多态会用到,或者一个工具类集合

静态方法与类方法的对比

  1. 不用加self,其他差不多

属性方法property(类似Java中get/set方法)

  1. 把一个方法变成一个属性,然后像属性一样用,不用加括号调用
  2. 屏蔽信息获取解析过程,只暴露结果

静态方法

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

枚举类的介绍

  1. 象棋.帅.value # 象棋.帅的值
  2. 象棋.帅.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语法之类与对象相关推荐

  1. python语法学习之对象与参考,局部与全局变量

    对象与参考:当你创建一个对象并给它赋一个变量的时候,这个变量仅仅参考那个对象,而不是表示这个对象本身. 也就是说,变量名指向你计算机中存储那个对象的内存(指向同一个内存单元).这被称作名称到对象的绑定 ...

  2. Python 语法小知识

    为什么80%的码农都做不了架构师?>>>    序列解包       将含有多个值的序列解开,然后把值存放到变量中,当函数或者方法返回元组时这个特性很有用,可以把返回的序列值直接赋值 ...

  3. python语法书籍推荐_python语法的书

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 四大基本语法分别从变量命名规则.缩进原则.特殊关键字和特殊运算符四个方面,总结 ...

  4. python语法错误概述_python语法错误

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我是python中的新手,当我想在模块中编译代码时,我遇到语法错误:invail ...

  5. python提供两个对象身份比较操作符什么和什么来测试_python - 第二部分

    python 总结 >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. E ...

  6. 人工智能实践:TensorFlow笔记学习(二)—— Python语法串讲

    Python语法串讲  大纲 2.1 Linux指令.HelloWorld 2.2 列表.元组.字典 2.3 条件语句 2.4 循环语句 2.5 turtle模块 2.6 函数.模块.包 2.7 类. ...

  7. python基本语法语句-python 语法基础篇 一

    安装篇 编辑篇: 编辑python 一 : 在终端环境下输入python命令,回车键运行.这种方式称为 交互方式. 1️⃣ 打开终端: 2️⃣ 输入python 回车 3️⃣ 输入python 语法 ...

  8. python语法手册-python语法手册

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 常用的也不超过十个,这种相对于更为复杂的html标记语言来说,markdown可谓 ...

  9. python语法教程-Python语法教程总结规范

    Python语法易错点记录 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar-- 心分享.心 ...

最新文章

  1. 英国拟在其国内建立一套互联网过滤网
  2. 讲给普通人听的分布式数据存储
  3. vector机器人 HOW TO CHARGE VECTOR 如何给矢量充电
  4. 自下而上归并排序 数组实现
  5. SAP UI5 jQuery.sap.includeStyleSheet
  6. tomcat源码阅读之StandardHost和StandardEngine
  7. 【渝粤题库】国家开放大学2021春3608矿井水害防治题目
  8. 重命名 docker 容器名
  9. 单片机复位电路电容一定用电解电容_学好单片机必须了解的10个电路
  10. 如何使用confd+ACM管理Nginx配置
  11. phpcms内容页 调用 上一级栏目id,catname等信息 - 代码篇
  12. 小米bl未解锁变砖了如何刷机_如何安装MIUI 10
  13. 饿了么“多等5分钟”后,美团外卖宣布给骑手留出8分钟...
  14. ScaleAnimation缩放动画Demo
  15. [Python可视化] pyecharts安装入门及绘制中国贵州地图
  16. 文本分类(三) | (6) 番外篇(预训练语言模型的另一种使用方式)
  17. 【计算机网络】实验1:双绞线制作
  18. 网络性能指标及测试方法
  19. 在centos中运行出现错误:cannot find -lbz2
  20. 产品经理如何营销自己

热门文章

  1. word右击visio文件,显示unknow对象
  2. root开不了机破解版,已破解root
  3. PPT中图表类型的选择
  4. 这些使用手机的小技巧不容错过
  5. 利用PHP从大txt文件中提取章节名称及行号
  6. apt和git使用socks5代理
  7. 解决Input输入中文重复出现拼音
  8. 两种方法教你彻底卸载Ubuntu双系统,无启动项残留
  9. OAuth2.0授权码/oauth/authorize接口调用unauthorized异常
  10. java 未定义_未定义,未指定和实现定义的行为