面对对象编程
类和实例
class
关键字定义类
类名通常首字母大写
class My_Class_Student(object):
"""docstring for My_Class_Student"""
def __init__(self, name):
super(My_Class_Student, self).__init__()
self.name = name
lyy=My_Class_Student("liyuyuan")
print(lyy)
print(lyy.name) # liyuyuan
__init__
方法定义初始化对象时必须要传入的参数,比如上面student初始化时必须传入name
在类中定义的函数,第一个参数永远是实例变量self
,调用时不用传递该参数
数据封装
使用类中定义的方法来实现数据封装
class My_Class_Student(object):
"""docstring for My_Class_Student"""
def __init__(self, name):
super(My_Class_Student, self).__init__()
self.name = name
def print_name(self):
print(self.name)
lyy=My_Class_Student("liyuyuan")
print(lyy)
print(lyy.name) # liyuyuan
lyy.print_name() #liyuyuan
访问限制
让内部属性不被外部访问,可以再属性名称前加双下划线__
,在python中,以__
开头的变量名就为私有变量,外部不能访问(只能为__
不能_
)
class My_Class_Student(object):
"""docstring for My_Class_Student"""
def __init__(self, name):
super(My_Class_Student, self).__init__()
self.__name = name
def print_name(self):
print(self.__name)
lyy=My_Class_Student("liyuyuan")
print(lyy.__name) # AttributeError:'My_Class_Student' object has no attribute '__name'
lyy.print_name() #liyuyuan
变量名为
__xxx__
是特殊变量,外部可以直接访问的对于单下划线开头的变量,虽然可以访问,但是约定俗成不要访问,当做私有变量
对于
__
开头的变量,其实python是将其改名为_classname__变量名
,我们也可以通过其进行访问,不建议
继承和多态
继承
class Animal(object):
def run(self):
print('Animal is running...')
#继承了Animal 就自带了run方法
class Dog(Animal):
pass
#重写父类继承的方法
class Cat(Animal):
def run(self):
print('Cat is running...')
多态
判断一个变量是否是某个类型可以用isinstance()
判断:
b = Animal() # b是Animal类型
isinstance(b, Animal) #True
对于静态语言(java等),需要传入的必须是Animal类型或者其子类,否则无法调用其方法
对于python等动态语言,没有类型检查,只需要保证其有执行的方法就行了,就可以执行
这就是鸭子类型
获取对象信息
type()
用type()
来获取对象类型
if type("name") == type("dd"):
print("类型相同+",type("name")) # 类型相同+ <class 'str'>
isinstance()
对于继承关系来说,type()
并不好用,我们可以使用isinstance()
函数来判断class
类型
isinstance()
对于该类型以及父类继承链 均返回True
#用type() 判断的基本类型 也可以用isinstance判断
isinstance(123, int) # True
# 判断是否为某些类型的一种
isinstance([1, 2, 3], (list, tuple)) #True
dir() getattr() setattr() hasattr()
用dir()
来获得对象的所有属性和方法
hasattr()
判断该对象是否有此属性
setattr()
设置一个属性
getattr()
获取该属性的值 ,当试图获取不存在的属性,会抛出AttributeError
错误
实例属性和类属性
对于类属性,直接在class
定义
class My_Student_Class(object):
"""docstring for My_Student_Class"""
name="My_Student_Class" #在类中直接定义的类属性
stu1=My_Student_Class()
# 因为对象没有name属性,因此继续查找class的name属性
print(stu1.name) # My_Student_Class
print(My_Student_Class.name) #My_Student_Class
stu1.name="liyuyuan"
print(stu1.name," ",My_Student_Class.name) # liyuyuan My_Student_Class
del stu1.name #删除实例的name属性
print(stu1.name) # My_Student_Class