摘要:
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()