Python 7 面向对象编程

 1.类

class Student:
    # 类属性:定义在类中,方法外的变量
    school = '一小'

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

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

    # 静态方法
    @staticmethod
    def sm():
        print('静态方法不能调用实例属性和实例方法')

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

# 类属性, 直接用类名
print(Student.school)

# 创建类的对象
stu = Student('yy', 18)

# 实例属性,使用对象进行打点调用
print(stu.name, stu.age)
# 实例方法
stu.show()

# 类方法 @classmethod 进行修饰的方法,直接用类名打点调用
Student.cm()

# 静态方法 @staticmethod 进行修饰的方法,直接用类名打点调用
Student.sm()

实例
class Student:
    school = '一小'

    def __init__(self, xm, age):
        self.name = xm
        self.age = age

    def show(self):
        print(f'{self.name} {self.age}')

stu = Student('yy', 16)
stu2 = Student('ll', 17)
stu3 = Student('uu', 20)
stu4 = Student('kk',21)

print(type(stu))

Student.school = '教育'

lst = [stu, stu2, stu3, stu4]
for item in lst:
    item.show()

动态绑定
class Student:
    school = '一小'

    def __init__(self, xm, age):
        self.name = xm
        self.age = age

    def show(self):
        print(f'{self.name} {self.age}')

stu = Student('yy', 16)
stu2 = Student('ll', 17)

print(stu2.name)

# 动态绑定一个实例属性
stu.gender = '男'
print(stu.gender, stu.age)

# 动态绑定方法
def introduce():
    print('动态绑定')
    
stu2.fun = introduce  # 函数赋值

stu2.fun()

2. 面向对象

三大特征:封装,继承,多态

2.1 封装

权限控制
class Student():
    def __init__(self, name, age, gender):
        self._name = name  # 受保护,只能本类和子类访问
        self.__age = age  # 私有,只能类本身访问
        self.gender = gender

    def _fun1(self):
        print('子类及本身可以访问')

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

    def show(self):
        self._fun1()  # 类本身访问受保护的方法
        self.__fun2()  # 类本身访问私有方法
        print(self._name)  # 受保护的实例属性
        print(self.__age)  # 私有的实例属性

stu = Student('yy', 19, 'man')
print(stu._name)
stu._fun1()
print('-'*40)

# 私有实例属性和方法的访问
print(stu._Student__age)
stu._Student__fun2()
# 不推荐


属性设置
class Student():
    def __init__(self, name, gender):
        self.name = name
        self.__gender = gender

    # 用@property,将方法当成属性使用
    @property
    def gender(self):
        return self.__gender

    # 将gender这个属性设置为可写属性
    @gender.setter
    def gender(self,value):
        if value != 'man' and value != 'woman':
            print('wrong, 默认设为man')
            self.__gender = 'man'
        else:
            self.__gender = value

stu = Student('uu', 'man')
print(stu.name, stu.gender)

stu.gender = 'else'
print(stu.name, stu.gender)

2.2 继承
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def show(self):
        print(self.name, self.age)

# Student 继承 Person类
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('yy', 20, '1001')
stu.show()

doctor = Doctor('uu', 34, '外科')
doctor.show()

方法重写

子类直接show()

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def show(self):
        print(self.name, self.age)

# Student 继承 Person类
class Student(Person):
    def __init__(self, name, age, stuno):
        super().__init__(name, age)
        self.stuno = stuno
    def show1(self):
        print(self.name, self.age, self.stuno)


class Doctor(Person):
    def __init__(self, name, age, department):
        super().__init__(name, age)
        self.department = department

stu = Student('yy', 20, '1001')
stu.show()
stu.show1()

doctor = Doctor('uu', 34, '外科')
doctor.show()

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def show(self):
        print(self.name, self.age)

# Student 继承 Person类
class Student(Person):
    def __init__(self, name, age, stuno):
        super().__init__(name, age)
        self.stuno = stuno
    def show1(self):
        print(self.name, self.age, self.stuno)


class Doctor(Person):
    def __init__(self, name, age, department):
        super().__init__(name, age)
        self.department = department
    def show2(self):
        super().show()
        print(self.department)


stu = Student('yy', 20, '1001')
stu.show()
stu.show1()

print('-'*40)

doctor = Doctor('uu', 34, '外科')
doctor.show()
doctor.show2()

多继承
class FatherA():
    def __init__(self, name):
        self.name = name

    def showA(self):
        print('A的方法')

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

    def showB(self):
        print('B的方法')

class Son(FatherA, FatherB):
    def __init__(self, name, age, gender):
        FatherA.__init__(self, name)
        FatherB.__init__(self, age)
        self.gender = gender

son = Son('yy', 20, 'man')
son.showA()
son.showB()

2.3  多态

class Person():
    def eat(self):
        print('人吃五谷杂粮')

class Cat():
    def eat(self):
        print('猫吃鱼')

class Dog():
    def eat(self):
        print('狗啃骨头')

# 这三个类中都有一个同名方法, eat
# 编写函数
def fun(obj):
    obj.eat()
    # 通过变量obj调用eat

# 创建三个类的对象
per = Person()
cat = Cat()
dog = Dog()

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

3. object()

收尾双下划线定义

特殊方法

a = 10
b = 20
print(a.__add__(b))

4. 特殊属性

class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self, name, age):
        self.name = name
        self.age = age

a = A()
b = B()
c = C('yy', 20)

# 属性字典
print(a.__dict__)
print(b.__dict__)
print(c.__dict__)

5. 类的浅拷贝深拷贝

copy.copy()

copy.deepcopy()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值