通过下面一个实例说明Python封装里面的几个基本概念:
- 对象:类对象,实例对象
- 属性:类属性,实例属性
- 方法:实例方法,类方法,静态方法
class Person: ##Person是类名,类定义完成之后,就会产生全局的类对象Person name = None ##name是公有的类属性 __age ##__age是私有的类属性。python中通过属性名的格式来区分公有和私有 def __init__(self, sex): ##类构造方法,是类内置方法中最常见的一种(方法名以__开始和结束) self.sex= sex ##self.sex是实例属性 def print_name(self): ##实例方法,最常用的定义成员方法。在类外只能通过实例对象去调用。在类里面定义的函数与类对象或实例对象绑定了,故称做方法 print self.name @classmethod ##类方法,类对象所拥有的方法,用@classmethod来标示。能够通过实例对象和类对象去访问。 def getAge(cls): return cls.__age def SetName(cls,name): ##通过类方法来修改类属性。这种方法修改的属性,类对象和实例对象都会受其影响。 cls.name = name ##更改类属性 @staticmethod(): ##静态方法,用@staticmethod来修饰,不需要多定义参数。 print self.__age if __name__ == "__main__": p = Person("Lily") ##对类对象Person进行实例化,产生实例对象p Person.name ##类对象的属性,通过类对象访问类中的公共属性 p.name ##实例属性,通过实例对象p来访问类中的公共属性 p.question = "WhoamI" ##给实例对象p添加一个实例属性question,该属性是实例对象特有的,类对象并不拥有它。 ##如果需要在类外修改类属性,必须通过类对象去引用然后修改。通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不影响到类属性。并且之后通过实例对象去引用该名称的属性,实例属性会屏蔽掉类属性,即引用的实例属性,除非删除该实例属性。
类是对现实世界公有规律的总结和抽象。当一个类定义完成后,就会产生类名的类对象。当对这个类对象进行实例化,就产生了一个实例对象。类的实现主要是通过属性和方法。在类里面定义,在所有类方法之外的属性,是类属性,如name; 在类方法里面的属性,是实例属性,如self.sex。
类属性和实例属性的区别有三个
方法中类方法和实例方法的区别在于
- 类属性是被所有类对象共有的,而实例属性只能被具体的实例所特有;
- 对属性的调用方式也不同。类属性可以通过类对象的引用方式和实例对象来调用,如Person.name 和p.name;而实例属性只能通过实例来调用,p.sex是正确的,Person.sex是错误的;
- 属性的修改方式不同。类属性只能通过类方法来更改,实例属性只能通过实例方法来更改。
- 类方法和实例方法的定义方式不同。类方法需要在方法之前用@classmethod来标示,同时类方法的第一个入参是cls.而实例方法无需特殊标示,实例方法的第一个入参是self。
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">调用方法不同。类方法可以通过类对象和实例对象来调用,而实例方法只能通过实例对象来调用。</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">作用范围不同。类方法可以在类中共用,而实例方法只能被具体的实例对象所特有。</span>