Python进阶三:面向对象基础

时间:2023-02-15 13:36:42

初始化实例属性:输入关键字信息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()