面对对象编程

类和实例

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