一、定义类

在面向对象的程序设计中有两种重要概念:

  • 类:可以理解为一个种类,一个模型,是一种抽象的东西。
  • 实例、对象:可以理解为一种具体制作或者存在的东西。

定义类的语法格式如下:

class 类名:
执行语句
零到多个类变量
零到多个类方法

例如我们需要制作一只碗,首先需要这个碗的模型就是类,在制作这个碗的过程就叫做实例化,制作出来的碗就是实例、对象;这个碗在中国制作,就是类变量;而这个碗的颜色、材料就是这个类的实例变量,具体请看下面代码:

class BowlModel:
make_in = 'China' # 类变量,不需要实例化就调用
def __init__(self,colour = 'red',material = 'lron'): # __init__方法一般用来对实例的属性进行初始化
# 下面两个是实例变量
self.colour = colour
self.material = material
print ('颜色:',self.colour,'材料:',self.material) # 定义make方法
def make(self,name):
print (name,'制作了一只',self.colour,self.material,'碗。')  

关于网上一些说__init__是构造函数,一些说__new__才是真正的构造函数,这里找了一些资料大致解析如下:

老式类中其实并没有 __new__ 方法,因为 __init__ 就是它的构造方法(函数)。

新式类允许开发者根据他们的意图来重写 __new__ 和 __init__ 方法。__new__ (构造函数)单独地创建一个对象,而 __init__ (初始化函数)负责初始化这个对象。

二、使用和创建对象

创建对象时,实际是调用了__new__方法,返回当前对象的一个实例,当实例被创建出来后,会调用__init__方法,对当前对象的实例初始化,没有返回值。

创建对象例:

# 调用BowlModel的构造方法,返回一个BowlModel对象
# 在创建实例对象时,__ini__执行了一次
# 将BowlModel对象赋值给a变量
a = BowlModel()
'''
这里在执行时,过程可以理解为:
a = object.__new__(BowlModel)
print (a) # 返回当前对象的实例,打印 <__main__.BowlModel object at 0x0000000002E2CCC0>
print (BowlModel.__init__(a)) # 执行了一次__init__方法,打印 颜色: red 材料: lron 返回 None '''
print (a) # 打印 <__main__.BowlModel object at 0x0000000002E2CD68>

 

当创建完对象之后,就可以对对象的实例变量进行操作(增、删、改、查),也可以调用和增加对象的方法。

具体语法如下:

对象.方法(参数)
对象.变量  

对对象的实例变量进行增、删、改、查如下:

# 访问对象的变量
print (BowlModel.make_in)
print (a.make_in) # 访问a实例,直接为colour实例变量赋值
a.colour = 'green'
print (vars(a)) # 返回当前范围局部变量的字典,打印 {'colour': 'green', 'material': 'lron'} # 输出a的material实例变量
print (a.material) # 打印 lron # 为a对象动态增加factory实例变量
a.factory = '陶瓷厂'
print (vars(a)) # 打印 {'colour': 'green', 'material': 'lron', 'factory': '陶瓷厂'} # 使用del语句,动态删除a对象的factory实例变量
del a.factory
print (vars(a)) # 打印 {'colour': 'green', 'material': 'lron'}

调用对象的方法例:

# 调用a对象的make方法,因为第一参数是自动绑定的,只需要为第二个参数传入一个值
a.make('老王') # 打印 老王 制作了一只 green lron 碗。

为对象动态增加方法,例:

def company(self,company_name):
print (company_name,'在制作一只',self.colour,self.material,'碗。') a.cy = company
#print (a.cy('大大陶瓷厂'))
# 报错 TypeError: company() missing 1 required positional argument: 'company_name'
# 由于Pyhon不会自动将调用者绑定到第一个参数self,故需要手动将调用者绑定到第一个参数
a.cy(a,'大大陶瓷厂')
# 打印 大大陶瓷厂 在制作一只 green lron 碗。

当然也可以利用lambda表达式为a对象动态增加方法,例:

a.use = lambda self,people : print (people,'正在使用一只',self.colour,self.material,'碗。')
# 同样需要手动将调用者绑定到第一个参数
a.use(a,'大明')
# 打印 大明 正在使用一只 green lron 碗。  

如果想让a对象动态增加的方法自动绑定第一个参数,可以使用types模块下的MethodType进行包装,例:

test = lambda self,tester : print (tester,'正在测试一只',self.colour,self.material,'碗。')

from types import MethodType
# 使用MethodType对test进行包装,将第一个参数自动绑定为a
a.test = MethodType(test,a)
a.test('小宗')
# 打印 小宗 正在测试一只 green lron 碗。

  

Python——类和对象(一)的更多相关文章

  1. python类与对象各个算数运算魔法方法总结

    1.python类与对象各个算术运算魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常 ...

  2. python 类和对象的属性

    python类和对象的属性分为类属性和对象属性两大类,类属性属于类,而对象属性属于对象. 1. 父类的对象属性会被子类的对象继承. 2. 父类的类属性会被子类继承,还是作为类属性,如果父类改变了类属性 ...

  3. 一文讲全了Python 类和对象内容

    摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan  . Pytho ...

  4. python类、对象

    python类.对象 学习完本篇,你将会深入掌握 什么是类,对象 了解类和对象之间的关系 能独立创建一个People(人类),属性有姓名.性别.年龄.提供一个有参的构造方法,编写一个show方法,输出 ...

  5. python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  6. python类、对象、方法、属性之类与对象笔记

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  7. python类与对象基本语法

    面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 类就相当于制造飞机时的图纸,用它 ...

  8. python 类和对象

    类和对象 类 1.类的组成    数据和函数,二者是类的属性 2.两个作用: 实例化 属性引用  属性引用:类名.属性(增删改查)   实例化: 类名加括号就是实例化,会自动出发__init__的运行 ...

  9. Python类和对象

    目录 类与对象 其他方法 继承 经典类和新式类 派生 组合 接口.归一化设计与抽象类 继承实现的原理 子类中调用父类的方法 指名道姓 super()方法 多态与多态性 封装 单下划线开头 双下划线开头 ...

  10. python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于“有一个”的场景中,继承用于“是一个”的场景 ...

随机推荐

  1. IDEA Junit FileNotFoundException: class path resource [spring/spring.xml] cannot be opened because it does not exist

    今天打算写一个单元测试,但是已经有写好的单元测试无论怎么弄都提示文件不存在,自己一度以为是启动方式不正确.这里简单记录一下处理过程 1 异常信息: Caused by: org.springframe ...

  2. GO make&new区别

    自:http://www.cnblogs.com/ghj1976/archive/2013/02/12/2910384.html 1.make用于内建类型(map.slice 和channel)的内存 ...

  3. 个人学习分布式专题(二)分布式服务治理之分布式协调技术Zookeeper

    分布式协调技术Zookeeper 2.1 zookeeper集群安装部署(略) 2.2 zookeeper的基本原理,数据模型 2.3 zookeeper Java api的使用 2.4 zookee ...

  4. new HttpClient().PostAsync封装参数

    var data = Encoding.UTF8.GetBytes("{ \"y\": 5, \"x\": 3}"); var conten ...

  5. VS2017调试程序时 无法启动web iis或者提示ID为***的进程未启动

    打开项目的.csproj文件,定位到<WebProjectProperties>,把关于IIS的配置<DevelopmentServerPort>.<Developmen ...

  6. lvs,nginx,haproxy的优缺点,适合场景

    Nginx/LVS/HAProxy的基于Linux的开源免费的负载均衡软件. LVS:使用集群技术和Linux操作系统实现一个高性能.高可用的服务器,它具有很好的可伸缩性.可靠性和可管理性,是一款强大 ...

  7. Oracle 11g 监听很慢,由于监听日志文件太大引起的问题(Windows 下)

    现象:Windows 操作系统的Oracle 数据库,使用sqlplus 连接(不指定实例名)连接很快,程序连接或使用连接工具或在Net Manager 中测试连接都需要花费约三四十秒的时间(程序连接 ...

  8. PaddlePaddle实现线性回归

    在本次实验中我们将使用PaddlePaddle来搭建一个简单的线性回归模型,并利用这一模型预测你的储蓄(在某地区)可以购买多大面积的房子.并且在学习模型搭建的过程中,了解到机器学习的若干重要概念,掌握 ...

  9. 终极解决办法rvct Cannot obtain license for Compiler (feature compiler) with license version >= 3.1

    参考:https://blog.csdn.net/nic_r/article/details/7458038 ARM C/C++ Compiler, RVCT4. [Build ] armcc : e ...

  10. 怎样提交社区项目Karbor的Bug?

    1.登录社区Karbor Launchpad地址: https://bugs.launchpad.net/karbor/+filebug 输出bug简介,点击Next按钮. 2.填写Bug描述,完成B ...