位置: 编程技术 - 正文

python类:class创建、数据方法属性及访问控制详解(python中创建类对象)

编辑:rootadmin

推荐整理分享python类:class创建、数据方法属性及访问控制详解(python中创建类对象),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python 创建class,python中创建类对象,python中类的创建,python中类的创建,python中创建类对象,python 创建class,python中创建类对象,python 创建class,内容如对您有帮助,希望把文章链接给更多的朋友!

在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象。

python中创建类

创建一个Student的类,并且实现了这个类的初始化函数”__init__”:

class Student(object): count = 0 books = [] def __init__(self, name): self.name = name

接下来就通过上面的Student类来看看Python中类的相关内容。

类构造和初始化

”__init__”和”__new__”的联系和差别

下面先通过一段代码看看这两个方法的调用顺序:

从代码的输出可以看到,当通过类实例化一个对象的时候,”__new__”方法首先被调用,然后是”__init__”方法。

一般来说,”__init__”和”__new__”函数都会有下面的形式:

对于”__new__”和”__init__”可以概括为:

&#;“__new__”方法在Python中是真正的构造方法(创建并返回实例),通过这个方法可以产生一个”cls”对应的实例对象,所以说”__new__”方法一定要有返回

&#;对于”__init__”方法,是一个初始化的方法,”self”代表由类产生出来的实例对象,”__init__”将对这个对象进行相应的初始化操作

__new__特性

“__new__”是在新式类中新出现的方法,它有以下行为特性:

&#;“__new__” 方法是在类实例化对象时第一个调用的方法,将返回实例对象

&#;“__new__” 方法始终都是类的静态方法(即第一个参数为cls),即使没有被加上静态方法装饰器

&#;第一个参数cls是当前正在实例化的类,如果要得到当前类的实例,应当在当前类中的 “__new__” 方法语句中调用当前类的父类的” __new__” 方法

对于上面的第三点,如果当前类是直接继承自 object,那当前类的 “__new__” 方法返回的对象应该为:

重写__new__

如果(新式)类中没有重写”__new__”方法,Python默认是调用该类的直接父类的”__new__”方法来构造该类的实例,如果该类的父类也没有重写”__new__”,那么将一直按照同样的规则追溯至object的”__new__”方法,因为object是所有新式类的基类。

而如果新式类中重写了”__new__”方法,那么可以选择任意一个其他的新式类(必须是新式类,只有新式类有”__new__”,因为所有新式类都是从object派生)的”__new__”方法来创建实例,包括这个新式类的所有前代类和后代类,只要它们不会造成递归死循环。

看一段例子代码:

代码的输出为:

__init__的调用

“__new__”决定是否要使用该类的”__init__”方法,因为”__new__” 可以调用其他类的构造方法或者直接返回别的类创建的对象来作为本类的实例。

通常来说,新式类开始实例化时,”__new__”方法会返回cls(cls指代当前类)的实例,然后调用该类的”__init__”方法作为初始化方法,该方法接收这个实例(即self)作为自己的第一个参数,然后依次传入”__new__”方法中接收的位置参数和命名参数。

但是,如果”__new__”没有返回cls(即当前类)的实例,那么当前类的”__init__”方法是不会被调用的。

例子:

代码中,在B的”__new__”方法中,通过”obj = object.__new__(A, *args, **kwargs)”创建了一个A的实例,在这种情况下,B的”__init__”函数就不会被调用到。

派生不可变类型

关于”__new__”方法还有一个重要的用途就是用来派生不可变类型。

例如,Python中float是不可变类型,如果想要从float中派生一个子类,就要实现”__new__”方法:

代码中从float派生出了一个Round2Float类,该类的实例就是保留小数点后两位的浮点数。

通过内建函数dir(),或者访问类的字典属性__dict__,这两种方式都可以查看类有哪些属性。

数据属性

类数据属性和实例数据属性

在上面的Student类中,”count”"books”"name”和”age”都被称为类的数据属性,但是它们又分为类数据属性和实例数据属性。

类变量紧接在类名后面定义,相当于java和c++的static变量

实例变量在__init__里定义,相当于java和c++的普通变量

>>> class test: count = 0;类变量 def __init__(self, c): self.count = c; 实例变量 self.__class__.count = self.__class__.count + 1;>>> a = test(3)>>> a.count3>>> test.count1

对于类数据属性和实例数据属性,可以总结为:

1.类数据属性属于类本身,可以通过类名进行访问/修改

2.类数据属性也可以被类的所有实例访问/修改

3.在类定义之后,可以通过类名动态添加类数据属性,新增的类属性也被类和所有实例共有

4.实例数据属性只能通过实例访问

5.在实例生成后,还可以动态添加实例数据属性,但是这些实例数据属性只属于该实例

特殊的类属性

对于所有的类,都有一组特殊的属性:

类属性 含义 __name__ 类的名字(字符串) __doc__ 类的文档字符串 __bases__ 类的所有父类组成的元组 __dict__ 类的属性组成的字典 __module__ 类所属的模块 __class__ 类对象的类型

Note:文档字符串对于类,函数/方法,以及模块来说是唯一的,也就是说__doc__属性是不能从父类中继承来的。

属性隐藏

python类:class创建、数据方法属性及访问控制详解(python中创建类对象)

从上面的介绍了解到,类数据属性属于类本身,被所有该类的实例共享;并且,通过实例可以去访问/修改类属性。

但是,在通过实例中访问类属性的时候一定要谨慎,因为可能出现属性”隐藏”的情况。

继续使用上面的Student类,来看看属性隐藏:

wilber = Student("Wilber", ) print "Student.count is wilber.count: ", Student.count is wilber.countwilber.count = 1 print "Student.count is wilber.count: ", Student.count is wilber.countprint Student.__dict__print wilber.__dict__del wilber.countprint "Student.count is wilber.count: ", Student.count is wilber.count print wilber.count += 3 print "Student.count is wilber.count: ", Student.count is wilber.countprint Student.__dict__print wilber.__dict__ del wilber.count

print print "Student.books is wilber.books: ", Student.books is wilber.bookswilber.books = ["C#", "Python"]print "Student.books is wilber.books: ", Student.books is wilber.booksprint Student.__dict__print wilber.__dict__del wilber.booksprint "Student.books is wilber.books: ", Student.books is wilber.books print wilber.books.append("CSS")print "Student.books is wilber.books: ", Student.books is wilber.booksprint Student.__dict__print wilber.__dict__

代码的输出为:

分析一下上面代码的输出:

&#;对于不可变类型的类属性Student.count,可以通过实例wilber进行访问,并且”Student.count is wilber.count”

&#;当通过实例赋值/修改count属性的时候,都将为实例wilber新建一个count实例属性,这时,”Student.count is not wilber.count”

&#;当通过”del wilber.count”语句删除实例的count属性后,再次成为”Student.count is wilber.count”

&#;同样对于可变类型的类属性Student.books,可以通过实例wilber进行访问,并且”Student. books is wilber. books”

&#;当通过实例赋值books属性的时候,都将为实例wilber新建一个books实例属性,这时,”Student. Books is not wilber. books”

&#;当通过”del wilber. books”语句删除实例的books属性后,再次成为”Student. books is wilber. books”

&#;当通过实例修改books属性的时候,将修改wilber.books指向的内存地址(即Student.books),此时,”Student. Books is wilber. books”

Note: 虽然通过实例可以访问类属性,但是,不建议这么做,最好还是通过类名来访问类属性,从而避免属性隐藏带来的不必要麻烦。

方法

在一个类中,可能出现三种方法,实例方法、静态方法和类方法,下面来看看三种方法的不同。

实例方法

实例方法的第一个参数必须是”self”,”self”类似于C++中的”this”。

实例方法只能通过类实例进行调用,这时候”self”就代表这个类实例本身。通过”self”可以直接访问实例的属性。

类方法

类方法以cls作为第一个参数,cls表示类本身,定义时使用@classmethod装饰器。通过cls可以访问类的相关属性。

class Student(object): ''' this is a Student class ''' count = 0 books = [] def __init__(self, name, age): self.name = name self.age = age @classmethod def printClassInfo(cls): print cls.__name__ print dir(cls) pass Student.printClassInfo() wilber = Student("Wilber", )wilber.printClassInfo()

代码的输出为,从这段代码可以看到,类方法可以通过类名访问,也可以通过实例访问。

静态方法

与实例方法和类方法不同,静态方法没有参数限制,既不需要实例参数,也不需要类参数,定义的时候使用@staticmethod装饰器。

同类方法一样,静态法可以通过类名访问,也可以通过实例访问。

这三种方法的主要区别在于参数,实例方法被绑定到一个实例,只能通过实例进行调用;但是对于静态方法和类方法,可以通过类名和实例两种方式进行调用。

访问控制

Python中没有访问控制的关键字,例如private、protected等等。

但是,在Python编码中,有一些约定来进行访问控制。

“_”和” __”的使用 更多的是一种规范/约定,不没有真正达到限制的目的:

“_”:以单下划线开头的表示的是protected类型的变量,即只能允许其本身与子类进行访问;同时表示弱内部变量标示,如,当使用”from moduleNmae import *”时,不会将以一个下划线开头的对象引入。“__”:双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了,连子类也不可以,这类属性在运行时属性名会加上单下划线和类名。

单下划线”_”

在Python中,通过单下划线”_”来实现模块级别的私有化,一般约定以单下划线”_”开头的变量、函数为模块私有的,也就是说”from moduleName import *”将不会引入以单下划线”_”开头的变量、函数。

现在有一个模块lib.py,内容用如下,模块中一个变量名和一个函数名分别以”_”开头:

当通过下面代码引入lib.py这个模块后,所有的以”_”开头的变量和函数都没有被引入,如果访问将会抛出异常:

双下划线”__”

对于Python中的类属性,可以通过双下划线”__”来实现一定程度的私有化,因为双下划线开头的属性在运行时会被”混淆”(mangling)。

在Student类中,加入了一个”__address”属性:

当通过实例wilber访问这个属性的时候,就会得到一个异常,提示属性”__address”不存在。

其实,通过内建函数dir()就可以看到其中的一些原由,”__address”属性在运行时,属性名被改为了”_Student__address”(属性名前增加了单下划线和类名)

以说,即使是双下划线,也没有实现属性的私有化,因为通过下面的方式还是可以直接访问”__address”属性:

双下划线的另一个重要的目地

避免子类对父类同名属性的冲突。

看下面一个例子:

当实例化B的时候,由于没有定义__init__函数,将调用父类的__init__,但是由于双下划线的”混淆”效果,”self.__private()”将变成 “self._A__private()”。

看到这里,就清楚为什么会有如下输出了:

A.__private()

B.public()

以上这篇python类:class创建、数据方法属性及访问控制详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

python直接访问私有属性的简单方法 实例化对象名._类名__私有属性名classFlylove:price=def__init__(self):self.__direction='gobeijing.'zIng='waitcar,manyperson'if__name__=='__main__':printFlylove.pricefly=Flylove()printfly.

浅谈python类属性的访问、设置和删除方法 类属性和对象属性我们把定义在类中的属性称为类属性,该类的所有对象共享类属性,类属性具有继承性,可以为类动态地添加类属性。对象在创建完

Python文件夹与文件的相关操作(推荐) 最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动。有关文件夹与

标签: python中创建类对象

本文链接地址:https://www.jiuchutong.com/biancheng/386232.html 转载请保留说明!

上一篇:python实现汉诺塔方法汇总(python5.7汉诺塔)

下一篇:python直接访问私有属性的简单方法

  • 分期付款进项税额怎么算
  • 建筑行业一般纳税人增值税税率是多少
  • 税收的三个基本要素是
  • 预收货款存入银行分录
  • 电影院场地出租价格
  • 所得税汇算清缴分录怎么做
  • 应收账款现金收回金额有限制嘛
  • 互联网合同范本
  • 营改增后增值税专用发票抵扣规定
  • 物业收停车费要交房产税吗
  • 汇总缴纳增值税附加税如何缴纳
  • 印花税的滞纳金怎么计算
  • 库存商品结转成本摘要怎么写
  • 服务性行业受气
  • 处理固定资产账务处理税率
  • 房地产开发项目土地使用权的取得方式
  • 客户退回货物会计分录
  • 收到上年度企业所得税退税款
  • 生产车间折旧为0的原因
  • 外贸公司进出口权办理流程
  • win11 应用商店
  • 公司+农户经营模式是什么意思
  • 固定资产增值税税率
  • win10桌面没有我的电脑图标怎么办
  • 建筑行业怎么做职业生涯规划
  • php常用设计模式(大总结)
  • 购买股票的会计分录
  • 纳税申报的流程有哪三步
  • executor进程
  • php 魔术
  • wordpress创建
  • 企业所得税核定征收方法有哪两种
  • 财政总预算会计分为几级
  • 暂估成本的账务处理分录
  • 本月职工工资
  • 小规模纳税人低于30万怎么填报申报表
  • Vue2 Element description组件 列合并
  • 增值税代扣代缴税率是多少
  • vue在项目中怎么用的
  • 前端可以用jsp写吗
  • php封装app打包
  • php单例模式
  • 工业企业总产值怎么算
  • 红字发票信息表编号
  • python多态的概念
  • 门诊收费票据能重新打印吗
  • 新个税累计免税额
  • 财务负责人和法人可以一个人吗
  • 抵扣联过期时间
  • 代扣代缴增值税怎么做账
  • 怎么处理固定资产残值
  • 主营业务成本借贷方向增减
  • 向客户收取的承兑贴息款如何开发票
  • 餐饮怎么扣税
  • win10安装mysql5.6
  • linux系统转换为win系统脚本
  • ubuntu14.04下apt-get install的报错以及解决方法
  • linux中的awk命令详解
  • win8系统怎么设置共享局域网
  • linux中keepalive
  • 激素六项雌二醇30
  • android 坐标系
  • jquery选择器的使用
  • jquery和css的区别
  • 复制文件到c盘需要管理员权限
  • js秒数转时间
  • c# 查找字符串
  • javascript的描述
  • unity3.
  • javascript tab切换
  • javascript中的对象用于
  • javascript怎么做
  • python怎么定义
  • jquery的插件
  • 512到底是什么意思
  • 国家税务湖北税务局
  • 盼之代售怎么下载
  • 别人用你的收款码能骗到钱吗
  • 苏州汇川和深圳汇川那个好
  • 北京市工会会员卡免费公园有哪些
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设