摘要:
python使用class定义了一个类,然后实例化一个类。实例可以调用类里面的方法或属性,当然,类也是可以调用类里面的方法或这属性的。所以这边文章主要是弄清楚调用关系和类的成员。
一,属性(字段)
定义类的属性,有的人叫做静态字段,静态字段属于类,当然它也可以被实例调用。
class Person(object): nationality = 'china' def __init__(self): pass p1 = Person() print p1.nationality print Person.nationality
如上图,可见定义1个类的属性只需要在class下面定义1个变量即可。至于调用方式可以实例化1个类出来调用亦或者直接使用类调用。建议,最好使用类调用。
- 静态字段在内存中只保存一份
- 普通字段在每个对象中都要保存一份
所以,通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段,即在class下面直接定义变量。
2,私有字段(私有属性)
class Person(object): nationality = 'china' def __init__(self,name,age): self.name=name self.age=age p1 = Person('tom',22) print p1.name print p1.age print Person.name
如上图可知,self.name ,self.age 为实例的属性,可以通过实例化一个类,通过实例化出来的类的对象来调用属性。
定义私有字段的时候,用双下划线开头。
通过 def __init__(self)函数来初始化1个类,在初始化的同时绑定一些属性实例里面
class Person(object): nationality = 'china' __gender='man' def __init__(self,name,age,salary): self.name=name self.age=age self.__salary=salary def privacte(self): print self.__gender print self.__salary p1 = Person('tom',22,10000) p2 = Person('jack',23,20000) p1.privacte()
从上图可知,1个实例或者类是无法直接调用类里面的私有字段的,只能将私有字段放入函数中,通过调用函数的方法,间接的调用私有字段。
当然,如果你非要在外部调用类里面的私有字段:对象._类名__私有属性 即 print p1.Person__salary 这种方式也是可以的(主要用于测试)!!!
二,方法(函数)
方法包括:普通方法,静态方法,类方法,三种方法都在内存中都属于类,区别在于调用方式不同。
- 普通方法:由对象调用,至少一个self参数;执行普通方法时,自动调用该方法的对象赋值给self.
- 私有方法:由对象调用,需要构建一个函数,通过构建的函数执行,最后通过对象调用该构建函数方可执行。
- 静态方法:由类调用
- 类方法:顾名思义,由类调用,至少一个cls参数,执行类的方法时候,自动将调用该方法的类赋值给cls;
1,普通方法
class Person(object): nationality = 'china' def __init__(self,name,age): self.name=name self.age=age def action(self): print self.name + ' go to beijing to see the model' p1 = Person('tom',22) p2 = Person('jack',23)
2,私有方法(通私有字段非常相似,也是无法直接调用,只能通过构造1个函数,间接调用)
class Person(object): nationality = 'china' def __init__(self, name, age): self.name = name self.age = age def __dabaojian(self): print self.name + ' go to dabaojian' def temp(self): self.__dabaojian() p1 = Person('tom', 22) p2 = Person('jack', 23) p1.temp()
如上图可知,定义一个私有方法,需要用def __+名称的方式开头,私有方法无法直接供对象调用,需要构造1个函数,通过调用该函数间接完成调用私有方法。
3,静态方法(类和对象皆可调用)
class Person(object): nationality = 'china' def __init__(self, name, age): self.name = name self.age = age @staticmethod def temp(): print 'I am a static method' p1 = Person('tom', 22) p2 = Person('jack', 23) p1.temp() Person.temp()
4,类方法
class Person(object): nationality = 'china' def __init__(self, name): self.name = name @classmethod def cls1(cls): print 'i am a class method' print cls.nationality @staticmethod def temp(): print 'I am a static method' p1 = Person('tom') p1.cls1() Person.cls1()