Bootstrap

python 基础学习3

面向过程:功能上封装,C语言

面向对象:属性和行为上封装,Java语言

面向对象三大特征:封装,继承(方法重写),多态 

 

一、类

1.1 类和对象

1.1.1 类的组成

1.1.2 类的定义

class student():
    school = '北京'# 类属性

    def __init__(self, xm, age):# 实例属性
        self.name = xm
        self.age = age

    # 实例方法
    def show(self):
        print("实例方法show()")
        print(f'{self.name},今年:{self.age}')

    @staticmethod
    def sm():
        print("静态方法,不能调用实例属性,也不能调用实例方法")

    @classmethod
    def cm(cls):
        print('类方法,不能调用实例属性,也不能调用实例方法')

stu = student('whh', 18)
print(type(stu))
print('实例属性:name,age=',stu.name,stu.age)
print('类属性:school=',student.school)
stu.show()
student.cm()
student.sm()



1.1.3 动态绑定属性和方法

stu1 = student('whh', 18)
stu2 = student('czh', 18)
print('stu1',stu1.name,stu1.age)
print('stu2',stu2.name,stu2.age)

def introduce():
    print('我是一个普通函数,我被动态绑定成stu2对象的方法')

#动态绑定属性和方法
stu2.gen='男'
stu2.fun=introduce
print('stu2:',stu2.name,stu2.age,stu2.gen)
stu2.fun()

1.1.4 权限控制

class student():
    def __init__(self,name,age,gen):
        self._name=name #受保护的,只能本类和子类访问
        self.__age=age  #私有的,只能本身使用
        self.gen=gen    #普通的实例属性,类本身,内部,外部,子类都可以访问

    def _fun1(self):    #受保护的
        print('子类及本身可以访问')

    def __fun2(self):   #私有的
        print('只能定义的类可以访问')

    def show(self): #普通的实例方法
        self._fun1()
        self.__fun2()
        print(self._name,self.__age)

stu = student('whh',18,'女')
print(stu._name)
#print(stu.__age)
stu._fun1()
#stu.__fun2()

#私有的实例属性和方法访问
print(stu._student__age)
stu._student__fun2()

print(dir(stu))

1.1.5 属性设置

class student():
    def __init__(self,name,gen):
        self.name=name
        self.__gen=gen

    #讲方法转成属性使用
    @property
    def gen(self):
        return self.__gen

    @gen.setter
    def gen(self,value):
        if value!='男'and value!='女':
            print('性别有误,已将性别设置为默认值男')
            self.__gen='男'
        else:
            self.__gen =value

stu = student('whh','女')
print(stu.name,stu.gen)

stu.gen='xx'
print(stu.name,stu.gen)


二、继承

2.1 单继承 

class person():
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def show(self):
        print(f'大家好,我叫:{self.name},我今年:{self.age}岁')

class student(person):
    def __init__(self,name,age,stuno):
        super().__init__(name,age)#调用父类初始化方法
        self.stuno=stuno

class doctor(person):
    def __init__(self,name,age,department):
        super().__init__(name,age)#调用父类初始化方法
        self.department=department

stu=student('whh',18,1001)
stu.show()

doctor=doctor('czh',20,'外科')
doctor.show()

2.2 多继承

class fasthera():
    def __init__(self,name):
        self.name=name

    def showa(self):
        print('父类a中方法')


class fastherb():
    def __init__(self, age):
        self.age = age

    def showb(self):
        print('父类b中方法')

class son(fasthera,fastherb):
    def __init__(self,name,age,gen):
        fasthera.__init__(self,name)
        fastherb.__init__(self,age)
        self.gen=gen

son=son('whh',20,'女')
son.showa()
son.showb()

2.3 方法重写

#方法重写
class person():
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def show(self):
        print(f'大家好,我叫:{self.name},我今年:{self.age}岁')

class student(person):
    def __init__(self,name,age,stuno):
        super().__init__(name,age)#调用父类初始化方法
        self.stuno=stuno

    def show(self):
        super().show()
        print(f'我是大学生,我的学号是:{self.stuno}')

class doctor(person):
    def __init__(self,name,age,department):
        super().__init__(name,age)#调用父类初始化方法
        self.department=department

    def show(self):
        super().show()
        print(f'我是医生,我的部门是:{self.department}')

stu=student('whh',18,1001)
stu.show()

doctor=doctor('czh',20,'外科')
doctor.show()

三、多态

#多态
class person():
    def eat(self):
        print('人')

class cat():
    def eat(self):
        print('猫')

class dog():
    def eat(self):
        print('狗')

def fun(obj):
    obj.eat()

person = person()
cat =cat()
dog=dog()

#不关心对象的数据类型,只关心对象是否具有同名方法
fun(person)
fun(cat)
fun(dog)

四、对象的特殊方法

五、特殊属性

六、深拷贝,浅拷贝

;