美文网首页
Python基础16-面向对象(方法)

Python基础16-面向对象(方法)

作者: Jacob_LJ | 来源:发表于2018-05-18 00:15 被阅读68次

Python基础-面向对象(方法)

1 方法与函数区别

  • 方法与函数主要区别:调用方式的不同
1. 函数 - 通过 “方法名()” 进行调用
2. 方法 - 通过 “目标.方法名” 进行调用
# 函数定义及调用
def eat():
    print(1)
    print(2)

eat()



# 类方法定义及调用
class Person:
    def eat2(self):
        print("11")
        print("22")

p = Person()
p.eat2()

2 方法的划分

2.1 实例方法

  • 默认第一个参数需要接收一个实例

2.2 类方法

  • 默认第一个参数需要接收一个类

2.3 静态方法

  • 第一个参数默认什么都不接收

参考例子(定义及调用)

class Person:
    def eat2(self):
        print("这是一个实例方法", self)

    @classmethod
    def leifangfa(cls):
        print("这是一个类方法", cls)

    @staticmethod
    def jingtaifangfa():
        print("这是一个静态方法")

p = Person()
print(p) # 结果 <__main__.Person object at 0x106c9e7f0>
p.eat2() #默认会将实例 p 传入方法 eat2 中, 结果:这是一个实例方法 <__main__.Person object at 0x106c9e7f0>
Person.eat2() # TypeError: eat2() missing 1 required positional argument: 'self'


Person.leifangfa() #默认会将 Person 类传入方法中,结果:这是一个类方法 <class '__main__.Person'>
p.leifangfa() #同样可以,结果:这是一个类方法 <class '__main__.Person'>

Person.jingtaifangfa() # 可以
p.jingtaifangfa() # 可以
  • 方法存放位置都在类的 __dict__的属性字典内,实例中没有
print(p.__dict__)
print(Person.__dict__)

# 结果
{}
{'__module__': '__main__', 'eat2': <function Person.eat2 at 0x10a01abf8>, 'leifangfa': <classmethod object at 0x109fe2630>, 'jingtaifangfa': <staticmethod object at 0x109fe2710>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}

2.4 注意

  1. 三种方法(实例方法、类方法、静态方法)划分的依据是:方法的第一个参数必须要接收的数据类型
  2. 不管是哪一种类型的方法,都是存在于类当中,没有在实例当中的
  3. 不同类型的方法调用方式不同,但一定要保证一个原则

    不管是自己传递,还是解析器帮我们处理,最终要保证:不同类型的方法的第一个参数接收到类型的数据,是它们想要的类型

2.5 方法调用方式

  • 实例方法
1. 标准调用
p.eat2() 


2. 非标准调用
Person.eat2(p) 

func = Person.eat2
func(p)



# 不传 self 参数的实例方式调用,此处没有声明为静态方法哦
class Person:
    def eat2():
        print("这是一个实例方法")

func = Person.eat2
func()
#下面调用方式则报错,通过实例调用就会默认传入实例作为第一个参数接收对象
p.eat2() 
Person.eat2()
  • 类方法
1. 标准调用
Person.leifangfa()
p.leifangfa() #这样调用为标准是文档告诉允许的,实际是也会默认将实例 p 的 class 作为第一个参数传入类方法中

2. 非标准调用
func = Person.leifangfa
func()

@classmethod 描述


@classmethod

静态方法

1. 标准调用
Person.jingtaifangfa() # 可以
p.jingtaifangfa() # 可以

2. 非标准调用
func = Person.jintai
func()
@staticmethod

2.6 三中方法内对两种属性的访问规则

  1. 实例方法
    • 能直接访问实例属性
    • 能直接访问实例对象对应 class 的类属性
  2. 类方法
    • 能直接访问类属性
  3. 静态方法
  • 一般不能访问类属性及实例属性

3 方法私有化

  • 本质上与属性私有化一样,因为它们都是存放在__dict__内的
class Person:
    __age = 18

    def __run(self):
        print("run")

    #test
    def _Person__run(self): #这样子定义会覆盖掉 run 方法
        print("xxx")


p = Person()
p._Person__run() #xxx

print(Person.__dict__) #只有一个_Person__run键,实际值是 print("xxx")

相关文章

  • Python基础16-面向对象(方法)

    1 方法与函数区别 方法与函数主要区别:调用方式的不同 2 方法的划分 2.1 实例方法 默认第一个参数需要接收一...

  • python面向对象学习笔记-01

    学习笔记 # 0,OOP-Python面向对象 - Python的面向对象 - 面向对象编程 - 基础 -...

  • Python OOP-1

    0. OOP-Python面向对象 Python面向对象 面向对象编程基础公有私有继承组合,Mixin 魔法函数魔...

  • python的面向对象

    python的面向对象(ObjectOriented,OO)-面向对象编程-基础-公有私有-继承-组合,Minxi...

  • python与class

    一、class基础概念 面向对象编程是最有效的软件编写方法之一,python使用类(class)来创建对象[1]。...

  • 001-python知识

    Python基础 一、Python的基本概念 (一)面向对象 Python是一门面向对象的语言,像C语言和GO语言...

  • Python面向对象(基础)

    面向对象 Python是支持面向对象的,面向对象编程是一种程序设计思想。 类和实例(基础) 面向对象最重要的就是类...

  • 【知识详解】JAVA基础(秋招总结)

    JAVA基础 目录 JAVA基础 问:面向过程(POP)和面向对象(OOP)? 问:Python和Java的区别?...

  • Python学习-面向对象

    查看所有Python相关学习笔记 面向对象 面向对象知识点汇总: 面向对象静态属性实例属性(self)静态方法(@...

  • 21.Python编程:访问权限

    前面一节重点学习了Python3中的面向对象最基础的类和对象的知识:类的定义、对象、构造方法、属性和方法等,在类中...

网友评论

      本文标题:Python基础16-面向对象(方法)

      本文链接:https://www.haomeiwen.com/subject/qvaidftx.html