self的使用:
self代表类的实例[对象],而非类本身
类的方法与普通的函数只有一个特殊的区别—>他们必须有一个额外的第一个参数名称,按照惯例它的名字是self(self不是python的关键字)
1.self在定义的时候需要定义,但是在调用的时候会自动传入
2.self的名字并不是规定死的,但是最好还是按照约定使用self
3.self总是指调用时的类的实例
类变量和成员变量:
类变量:定义在类中,且在函数体之外,类变量通常不作为实例变量使用,类变量在整实例化的过程中是公用的。
成员变量:定义在方法中且通过self绑定在实例上的变量,只作用于当前实例。
1.当类变量与成员变量同名时,使用对象来调用时,默认调用的是成员变量的值
2.当成员变量不存在,并且类变量存在的时候,在使用对象调用属性的时候,会调用类变量
3.成员变量只能通过对象来调用,而类变量不但可以通过对象调用,还可以通过类名来调用
4.通过对象来更改成员变量或者是类变量的值的时候,只是改变的当前对象的值,而通过类名来更改类变量的值的时候,更改的则是类变量的初始值。
成员方法、类方法、静态方法:
成员方法:
一般情况下在类中定义所有的方法我们都称之为成员方法,在成员方法中,它的第一个参数
self,声明的时候必须声明在参数列表中第一个位置,使用对象来进行调用的时候,对象会
将自己作为参数自动传递给self,不需要我们手动传递。
成员方法是给对象准备的,调用的时候必须使用对象来进行调用。
静态方法:
静态方法是一类特殊的方法,有时你可能需要写一个属于这个类的方法,但是这些代码完全不会使用到实例对象本身
类方法:
类方法不是绑定到对象上,而是绑定在类上的方法。
class Test:
x=1
@classmethod
def test(cls):
print(cls,cls.x)
Test.test()
对比:
成员方法:
当此方法中有使用到self【对象】/成员变量 的时候,必须将此方法写成成员方法。
类方法:
当此方法中没有使用到self/【成员变量】/成员方法,但是它使用到了类变量,
这时候我们必须将此函数写成类方法。
静态方法:
此方法中没有使用到成员变量,也没有使用到类变量,就是一个普通的方法,
这时候我们可以将此函数写成静态方法。
动态添加属性和方法:
#定义一个空类
class Person():
pass
# 动态添加属性[体现了动态语言的特点:灵活性]
per = Person()
per.name = "tom"
print(per.name)
#动态添加方法
def say(self):
print("my name is "+ self.name)
per.speak = say
per.speak(per)
但是,给一个实例绑定的方法对另外一个实例是不起作用的。
为了给所有的实例都绑定方法,可以通过给class绑定方法
def say(self,name):
self.name = name
print("my name is "+ self.name)
Person.speak = say
per = Person()
per.say()
给class绑定方法后,所有的实例均可调用