python 中面向对象编程简单总结1
1.类的定义方式
class ClassName(object): #object 表示继承的类,默认为object pass
类的使用类似函数的调用,也可以认为是调用了一次模板来创建一个实例。
2.创建对象的属性和方法
不同于java等语言的定义,python是动态语言,因此可以给同一个类的不同实例动态地增加不同的属性。
xiaoming = Person() xiaoming.name = "xiaoming" #赋值的时候创建一个实例的属性 xiaoming.gender = "male" xiaohong = Person() xiaohong.school = "sichuan university" #和xiaoming的属性可以不同 xiaohong.sex = "female"
在Python的中方法也可以动态地增加到实例对象中,需要用到 types.MethodType() ,这种情况在通常情况下不多见!一般还是定义在类中。
import types def fn_get_grade(self): if(self.score >= 80): return 'A' elif(self.score >= 60): return 'B' else: return 'C' class Person(object): def __init__(self,name,score): self.name = name self.score = score p1 = Person('Bob',90) #动态为p1绑定方法 p1.get_grade = types.MethodType(fn_get_grade,p1,Person) print p1.get_grade() #会输出A,方法动态绑定到p1对象上了 p2 = Person('Alice',65) print p2.get_grade() #Error,p2没有这个方法
3.初始化实例属性
def __init__(self,attr1,attr2): #在创建实例是被自动调用 self.attr1_name = attr1 self.attr2_name = attr2
4.访问限制
以双下划线开头,且不以双下划线结尾的属性名,无法被外界访问
5.创建类属性和方法
为类所有,没有用self.attr 的方式来绑定到对象的属性,它在类的方法中要通过 类名.类属性名 如: Person.cout 来访问。千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。
class Person(object): count = 0 #定义类属性 @classmethod #标记类方法 def how_many(cls): #cls表示类本身,作用相当于self return cls.count def __init__(self,name): self.name = name Person.count = Person.count + 1 #没有cls,需要用类名来访问类属性 print Person.how_many() p1 = Person('Bob') print Person.how_many()