零基础入门python3.7 ——基础知识总结(十七) self详解以及对象动态添加方法

一。self的由来

在创建类中无论是手动添加类的构造方法还是实例方法。 都会有一个seif参数。而且这个参数必须是第一个参数。实际上python中规定无论是构造方法还是实例方法。至少要包含一个参数。 至于参数的名称并没有强制的规定。只所以以self作为参数名只是程序员之间的一种约定俗成的写法。这样就可以提高可读性。开发中一看到self就知道应该怎么使用它。

二。认识self

假如说有一个关于汽车的类。那么也就意味着可以通过汽车这个类可以创建出成千上万两相同的汽车。那么随之产生的问题就是这么多一样的汽车怎么保证汽车的主人能准确的找到自己的汽车呢?self就此诞生。 他就相当于每一辆车上的钥匙。 这样以来车子的主人就能通过钥匙找到属于自己的车了。那么对应到类上来说也就是。 一个类可以实例化多个对象。当某个对象调用方法时,该对象会把自身的引用作为一个参数会传给该函数。换句话说python会自动绑定类方法的第一个参数指向调用该方法的对象。这样一来解释器就知道要调用那个对象的方法了。这也就是为什么在调用示例方法和构造方法时第一个参数不需要传值的原因。

  • 示例方法中的self指向函数的调用者即谁调用方法就指向谁
class Person:
    def add(self):
        print(self)
        print("哈哈哈")

a = Person()
b = Person()
a.add()
b.add()
print(a.add == b.add)

<__main__.Person object at 0x10469de10>
哈哈哈
<__main__.Person object at 0x104692c90>
哈哈哈
False
  • 对于构造函数中的self代表类实例化的对象
class Person:
    def add(self, name):
        self.nane = name

a = Person()
b = Person()
a.add('jack')
b.add('Alice')
print(a.nane)
print(b.nane)

jack
Alice
  • 除了通过实例对象调用方法外还可以通过函数调用对象的方法。无论怎么调用self总是指向调用者。
class Person:
    def add(self, name):
        self.nane = name

a = Person()
jack = a.add
jack('小张')
print(a.nane)

小张

三。给对象添加动态方法

python允许为对象动态添加方法。但是不回自动将调用者绑定到第一个参数上。即使在绑定的时候带上self参数也没用。


class Person:
    def add(self, name):
        self.nane = name

a = Person()

def getName(self):
    print(self)
    print("这是一个绑定的方法")

a.getNames = getName
a.getNames()

Traceback (most recent call last):
  File "/Users/apple/Documents/重要文件/python3/python21.py", line 12, in 
    a.getNames()
TypeError: getName() missing 1 required positional argument: 'self'
  • 第一种绑定方式
class Person:
    def add(self, name):
        self.nane = name

a = Person()

def getName(self):
    print(self)
    print("这是一个绑定的方法")

a.getNames = getName
a.getNames(a)


<__main__.Person object at 0x103f29b50>
这是一个绑定的方法
  • 第二种绑定方式
class Person:
    def add(self, name):
        self.nane = name

a = Person()

a.getName = lambda self: print(self, '这是一个动态发方法')
a.getName(a)

<__main__.Person object at 0x102ad5c90> 这是一个动态发方法
  • 借助types模块下的MethodType来实现,这种方式无需手动的给self传参
from types import MethodType
class Person:
    def add(self, name):
        self.nane = name

a = Person()
def getName(self):
    print(self)
    print("这是一个动态添加的方法")
a.getName = MethodType(getName, a)
a.getName()


<__main__.Person object at 0x10d3b9c90>
这是一个动态添加的方法

 

你可能感兴趣的:(python)