初始化实例属性:输入关键字信息attr=‘attr1’可以用kw.iteritems()
class Person(object): def __init__(self,name,gender,birth,**kw): self.name=name self.gender=gender self.birth=birth for k,v in kw.iteritems(): setattr(self,k,v) xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student') print xiaoming.name print xiaoming.job
访问限制:双下划线开头的变量不能被外部访问
class Person(object): def __init__(self, name, score): self.name=name self.__score=score p = Person('Bob', 59) print p.name print p.__score
定义类属性:直接绑定在类上的属性不需要创建实例,可以直接用类名访问(类属性和实例属性冲突:先寻找实例属性赋值或者引用然后再找类属性)
class Person(object): count = 0 def __init__(self,name): self.name=name Person.count=Person.count+1 p1 = Person('Bob') print Person.count p2 = Person('Alice') print Person.count p3 = Person('Tim') print Person.count
定义实例方法:实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的
class Person(object): def __init__(self, name, score): self.name=name self.__score=score def get_grade(self): return self.__score p1 = Person('Bob', 90) p2 = Person('Alice', 65) p3 = Person('Tim', 48) print p1.get_grade() print p2.get_grade() print p3.get_grade()
给实例动态添加方法:我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象:
import types def fn_get_grade(self): if self.score >= 80: return 'A' if self.score >= 60: return 'B' return 'C' class Person(object): def __init__(self, name, score): self.name = name self.score = score p1 = Person('Bob', 90) p1.get_grade = types.MethodType(fn_get_grade, p1, Person) #将fn_get_grade绑定到P1实例 print p1.get_grade() # => A p2 = Person('Alice', 65) print p2.get_grade() # ERROR: AttributeError: 'Person' object has no attribute 'get_grade' # 因为p2实例并没有绑定get_grade
类方法:在定义方法前加上@classmethod则绑定为类方法 类方法无法获得实例信息 类方法输入为传入一个类对象
class Person(object): __count = 0 @classmethod def how_many(ck): return ck.__count def __init__(self,name): self.name=name Person.__count=Person.__count+1 print Person.how_many() p1 = Person('Bob') print Person.how_many()
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-23 22:04:44