15、python面对对象之类和对象

前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念、类的定义、类属性、实例属性及实例方法等。

一、类和对象的概念



问题:什么是类?什么是实例对象?

类:是一类事物的抽象概念,不是真实存在的,描绘了该类事物共有的特征和行为

  • 例如:猫类、狗类、鸟类、车类等

实例对象:某类事物的具体个体,是该类事物的具体表现,它是真实存在的

  • 例如:“张三”是具体的某个“人“,”二哈“是具体的某个”狗“

二、类的定义



关键字:class

定义类的方法:

方式一:class 类名:

方式二:class 类名(object):

注意:方式一、方式二本质上是一样的,没有任何区别,只是写法不一样,他们都继承object这个基类。这里简单解释一下,在python3以前,

不继承object类会少很多可操作对象,这些都是类中的高级特性,但在python3以后所有类都默认继承这个object基类了。

类名的命名规范:

遵循标识符的命名规范,即由字母、数字及下划线组成且不能以数字开头,不能使用关键字。

建议使用大驼峰命名法(每个单词的第一个字母大写,例如:MyClass、TestCase)

三、类属性和实例属性


1.类属性

什么是类属性?就是一类事物的共同特征,比如狗类,共同特征:叫声(汪汪汪)、四只脚等

类属性:就是定义在类中的变量

类属性的访问:

  • 类可以直接访问类属性
  • 该类的实例对象也可以访问类属性
class Dog:  # 创建一个狗类
    cry = ‘汪汪汪‘  # 类属性
    leg = ‘四只脚‘  # 类属性

wangcai = Dog()  # 创建一个实例对象,旺财是一只具体的狗
print(‘通过类名直接访问类属性:‘.format(Dog.cry))  # 通过类名直接访问类属性
print(‘通过实例对象访问类属性:‘.format(wangcai.cry))  # 通过实例对象访问类属性

运行结果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
通过类名直接访问类属性:
通过实例对象访问类属性:

Process finished with exit code 0

2.实例属性

什么是实例属性?就是实例对象特有的属性,比如旺财是一个实例对象,他的名字叫旺财,这个名字就是一个实例属性

实例属性:实例对象特有的属性,添加实例属性的方式:

  • 实例对象.属性 = 属性值
  • 定义在类里的__init__方法里的变量

实例属性的访问:实例属性只有该实例对象自己能访问

class Dog:  # 创建一个狗类
    cry = ‘汪汪汪‘  # 类属性
    leg = ‘四只脚‘  # 类属性

    def __init__(self, name, age):
        """实例对象初始化方法"""
        self.name = name
        self.age = age

# 创建一个实例对象,因为有初始化方法__init__,定义了两个必需参数,因此实例化对象时需要传两个参数
wangcai = Dog(name=‘旺财‘, age=‘4‘)   # wangcai = Dog(‘旺财‘, ‘4‘)  这种写法也可以,顺序对应参数即可
dog_name = wangcai.name
dog_age = wangcai.age
print(‘狗的名字:{}‘.format(dog_name))  # 实例属性只能该实例对象访问
print(‘狗的年龄:{}‘.format(dog_age))

# 通过 实例对象.属性 = 属性值 再添加一个实例属性
wangcai.skill = ‘爬树‘
print(wangcai.skill)

# print(Dog.name)     # 实例属性是不能通过类去访问的,会报错

jojo = Dog(‘jojo‘, 3)   # 实例化对象,一只叫jojo的狗
dog_name2 = jojo.name   # jojo只能访问自己的属性,不能访问其他实例对象(旺财)的属性
print(‘狗的名字:{}‘.format(dog_name2))

运行结果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
狗的名字:旺财
狗的年龄:4
爬树
狗的名字:jojo

Process finished with exit code 0

  在上面例子中使用了一个__init__方法,这些是什么方法呢?被双下划线包起来的方法,是python中有特殊语义的方法,也叫魔术方法,

注意自定义方法时不要用这个格式命名。魔术方法不需要手动调用,在指定的条件下会自动触发,而这个__init__方法是在创建实例对象时

就会自动触发。

3.关于self的理解

  细心的你是不是发现了?在上面的例子,类里的init方法还有一个参数self,self是什么?有什么作用?

  self可以理解为自己,即实例对象本身,哪个实例对象去调用,这个self就指向哪个实例对象,python解释器会把这个实例对象作为第一

个参数传给self。这样是不是就能解释为什么实例属性只能该实例对象去访问呢。如果觉得有点绕,多理解几遍,多敲几遍吧!

四、实例方法


1.实例方法的定义

  • 实例方法直接定义在类中
  • 实例方法的第一个参数为self(这个参数必须要写)

2.实例方法的访问

  • 通过实例对象直接调用,该类的实例对象都可以访问,访问实例方法时会自动将实例对象本身作为第一个参数传给self接收
  • 通过类调用实例方法时,要传递一个self参数,即传递一个实例对象(很少用这种方法)
class Dog:  # 创建一个狗类
    cry = ‘汪汪汪‘  # 类属性
    leg = ‘四只脚‘  # 类属性

    def __init__(self, name, age):
        """实例对象初始化方法"""
        self.name = name
        self.age = age

    def skill(self):
        sk1 = ‘爬树‘  # 这里定义的只是一个方法里的变量,其他方法是无法调用的
        print(‘技能1:{}‘.format(sk1))

    def skill2(self, sk2):
        self.sk2 = sk2  # 接收参数sk2,这里为什么要用self.去接收?因为这样相当于定义了一个实例属性,self就是指向实例对象
        print(‘技能2:{}‘.format(self.sk2))

    def skill3(self):
        print(‘技能3:{}‘.format(self.sk2))    # 这里访问self.sk2就能访问
        print(‘技能4:{}‘.format(sk1))     # 这里访问sk1会报错,找不到

wangcai = Dog(name=‘旺财‘, age=‘4‘)  # wangcai = Dog(‘旺财‘, ‘4‘)  这种写法也可以,顺序对应参数即可
dog_name = wangcai.name
dog_age = wangcai.age
print(‘狗的名字:{}‘.format(dog_name))  # 实例属性只能该实例对象访问
print(‘狗的年龄:{}‘.format(dog_age))

wangcai.skill()  # 通过实例对象直接调用实例方法
wangcai.skill2(‘抓老鼠‘)  # 调用实例方法,该实例方法定义了一个必须参数
wangcai.skill3()

运行结果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
Traceback (most recent call last):
狗的名字:旺财
  File "D:/learn/python18_http_request/exercise/test.py", line 31, in <module>
狗的年龄:4
技能1:爬树
技能2:抓老鼠
技能3:抓老鼠
    wangcai.skill3()
  File "D:/learn/python18_http_request/exercise/test.py", line 20, in skill3
    print(‘技能4:{}‘.format(sk1))     # 这里访问sk1会报错,找不到
NameError: name ‘sk1‘ is not defined

Process finished with exit code 1

下面演示一个通过类访问实例方法(了解即可):

class Dog:  # 创建一个狗类
    cry = ‘汪汪汪‘  # 类属性
    leg = ‘四只脚‘  # 类属性

    def __init__(self, name, age):
        """实例对象初始化方法"""
        self.name = name
        self.age = age

    def skill(self):
        sk1 = ‘爬树‘  # 这里定义的只是一个方法里的变量,其他方法是无法调用的
        print(‘技能1:{}‘.format(sk1))

    def skill2(self, sk2):
        self.sk2 = sk2  # 接收参数sk2,这里为什么要用self.去接收?因为这样相当于定义了一个实例属性
        print(‘技能2:{}‘.format(self.sk2))

wangcai = Dog(name=‘旺财‘, age=‘4‘)  # wangcai = Dog(‘旺财‘, ‘4‘)  这种写法也可以,顺序对应参数即可
dog_name = wangcai.name
dog_age = wangcai.age
print(‘狗的名字:{}‘.format(dog_name))  # 实例属性只能该实例对象访问
print(‘狗的年龄:{}‘.format(dog_age))

# 通过类调用实例方法:要传递一个self参数,即传递一个实例对象
Dog.skill(wangcai)  # 传递一个实例对象
Dog.skill2(wangcai, ‘抓老鼠‘)  # 传递完实例对象再传方法里的必需参数

运行结果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
狗的名字:旺财
狗的年龄:4
技能1:爬树
技能2:抓老鼠

Process finished with exit code 0

作者:miki_peng

出处:https://www.cnblogs.com/miki-peng

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,请大家尊重原创,如要转载,请在文章页面明显位置注明出处,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/miki-peng/p/12238995.html

时间: 2024-11-08 01:41:40

15、python面对对象之类和对象的相关文章

Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2.异常种类 3.异常其他结构 4.主动触发异常 5.自定义异常 6.断言 四.反射 五. 单例模式 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass ob

Python - 面对对象(基础)

目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程(Object Oriented Programming,OOP,面向对象程序设计) 最易被初学者接受,其往往用一长段代码来实现指定功能,开发

python面对对象

中间隔有python模块没有进行更新,是因为觉得模块的操作应用更应该记牢,再次先不更新 1,面对对象的作用: 能简化思路和代码 2,面对对象的思路: 不着急直接去计算/操作代码获取结果 从一个大的问题中,要到要描述的角色 将角色的属性和行为抽象出来 形成一个模子 后期用到角色的时候,都围绕这个模子来操作.3,类 :一类抽象的事物,是描述了一类事物有哪些属性或者行为,但是不具体.4,实例:就是一个依托于类的规范存在的,被赋予了具体属性值得实际存在的物体5,对象 :就是实例--给类中约束的属性赋了具

16、python面对对象之类和继承

前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名一般约定为“cls",通过它来传递类的属性和方法 (不能传递实例属性和实例方法),跟实例方法的self用法相似. 2.类方法的调用 实例对象和类对象都可以调用 3.应用场景 在需要站在类的角度执行某个行为时,那么就可以定义为类方法 class Student: def __init__(self,

python面对对象编程

基本概念 class类 一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法 Object 对象 一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同 Encapsulation 封装在类中对数据的赋值.内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的

Python开发基础-Day31 Event对象、队列和多进程基础

Event对象 用于线程间通信,即程序中的其一个线程需要通过判断某个线程的状态来确定自己下一步的操作,就用到了event对象 event对象默认为假(Flase),即遇到event对象在等待就阻塞线程的执行. 示例1:主线程和子线程间通信,代码模拟连接服务器 1 import threading 2 import time 3 event=threading.Event() 4 5 def foo(): 6 print('wait server...') 7 event.wait() #括号里可

【Python初级】008-面向对象

面向对象 目录 1:类与对象 -------什么是类和对象 -------什么是属性与方法 2:面向对象的三大类型 -------封装 -------继承 -------多态 一.类与对象   -------什么是类和对象 Python中什么是对象?object=对象 Python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象.对象是存在的. Python中什么是类?class=类 在python中,把具有相同属性和方法的对象归为一

Python坑系列:可变对象与不可变对象

在之前的文章 http://www.cnblogs.com/bitpeng/p/4748148.html 中,大家看到了ret.append(path) 和ret.append(path[:])的巨大差别.这和Python的对象机制有关.现在谈谈这个问题! 我们知道,Python有可变对象和不可变对象,他们的表现行为也迥然不同.先来几个简单的问题: 1 def foo1(arg): 2 arg = 5 3 print(arg) 4 5 x = 1 6 foo(x) # 输出5 7 print(x

Python中使用pickle持久化对象

Python中可以使用 pickle 模块将对象转化为文件保存在磁盘上,在需要的时候再读取并还原.具体用法如下: 1 pickle.dump(obj, file[, protocol]) 这是将对象持久化的方法,参数的含义分别为:obj: 要持久化保存的对象:file: 一个拥有 write() 方法的对象,并且这个 write() 方法能接收一个字符串作为参数.这个对象可以是一个以写模式打开的文件对象或者一个 StringIO 对象,或者其他自定义的满足条件的对象.protocol: 这是一个