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

2018-05-18  本文已影响68人  Jacob_LJ

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() # 可以
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 方法私有化

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")
上一篇 下一篇

猜你喜欢

热点阅读