1.类和实例
class Student(object):#定义类
def __init__(self,name,score):#初始化函数,定义类的对象属性,在定义实例时不能传入空参数
self.name=name#属性,name,外部可以访问和改变属性
self.score=score#属性,score,外部可以访问和改变属性
def print_score(self):#定义类的方法,打印成绩
print('%s:%s' % (self.name,self.score))
def get_grade(self):#定义类的方法,打印成绩等级
if self.score>=90:
return 'A'
elif self.score>=60:
return 'B'
else:
return 'C'
bart=Student('Bart Simpson',59)
print('bart.name',bart.name)#打印实例bart的名字(外部访问)
print('bart.score',bart.score)#打印实例bart的成绩(外部访问)
print(bart.name,bart.print_score())#通过实例bart,调用方法print_score(),打印名字和成绩
print(bart.name,bart.get_grade())#通过实例bart,调用方法print_score(),打印成绩等级
2.访问限制:__gender 私有化参数属性,get_gender():获取private 参数,set_gender()修改private 参数
class Student(object):
def __init__(self,name,gender):
self.name=name #共有参数,外部可以直接访问和修改
self.__gender=gender#__gender:通过2个下划线将属性私有化,private,外部无法访问,bart.__name 用法已经不能直接访问
def get_name(self):
return self.name
def get_gender(self):#通过get__gender 方法,外部代码可以获取name
return self.__gender
def set_gender(self,gender):#通过set__gender 方法,允许外部代码修改gender,在方法中可以对参数做检查,避免无效参数
if gender=='male'or gender=='female':
self.__gender=gender
else:
raise ValudeError('invalid character')
bart=Student('Bart Simpson','male')
print(bart.name,bart.get_gender())#通过get_gender()才能获取gender
if bart.get_gender() != 'male':
print('test failed!')
else:
bart.set_gender('female')#外部代码修改性别为female
if bart.get_gender() != 'female':
print('test failed!')
else:
print('test successfully!')
print(bart.get_name(),bart.get_gender())
3.继承和多态
继承:子类获得父类全部功能,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。Python 动态语言 VS Java 静态语言
class Animal(object):
def run(self):
print('Animal is running...')
class Dog(Animal):#继承类Animal
def run(self):
print('Dog is running ...')#覆盖父类的run 方法,打印 Dog is running,体现了多态性
def eat(self):
print('Eating meat....')#子类可以增加方法
class Cat(Animal):#继承类Animal
def run(self):
print('Cat is running ...')
dog=Dog()#dog 既是Dog类型,也是其父类Animal 类型
cat=Cat()
print(dog.run())
print(cat.run())
print('dog is Dog?',isinstance(dog,Dog))
#动态语言的鸭子特性,即使定义在类外,只要传入的对象有run 方法:
def run_twice(animal):
animal.run()
animal.run()
a=run_twice(Animal())
b=run_twice(Dog())
print(a)
print(b)
4.获取对象信息
4.1.type() :判断对象类型,返回对应的Class类型
能用type()判断的基本类型也可以用isinstance()判断:
4.2 isinstance()
image.png并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:
image.png
总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。
4.3.dir()
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法。配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态。
class MyObject(object):
def __init__(self):
self.x=9
def power(self):
return self.x*self.x
obj=MyObject()
print('hasattr(obj,\'x\')',hasattr(obj,'x'))#有属性'x' 吗
print('hasattr(obj,\'y\')',hasattr(obj,'y'))#有属性'y' 吗
setattr(obj,'y',19)#设置一个属性‘y'
print('hasattr(obj,\'y\')',hasattr(obj,'y'))#有属性'y' 吗
print('getattr(obj,\'y\')',getattr(obj,'y'))#获取属性'y'
print('obj.y=',obj.y)#获取属性'y'
print('getattr(obj,\'z\')',getattr(obj,'z',404))#获取属性'z',如果没有返回赋予的默认值404
f=getattr(obj,'power')#获取属性'power',并赋予给f,f 只想power()
print(f)
print(f())#调用power()
5.实例属性和类属性
优先级:实例属性>类属性
注意:
1)实例属性属于各个实例所有,互不干扰;
2)类属性属于类所有,所有实例共享一个属性;
3)不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性
class Student(object):
count=0#类属性‘count’
def __init__(self,name):
self.name=name
Student.count+=1#每添加一个实例,类属性'count'+1
bart=Student('Bart')
print(Student.count)
网友评论