【15】面向对象

2019-03-20  本文已影响0人  Z_JoonGi

1. 编程思想的转变

a.面向过程的编程 -- 算法

b.函数式编程 -- 函数/模块

c.面向对象编程 -- 类和对象

2.类、对象

a.定义

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

b.类的声明

1)语法

class 类名:
    类的内容

2)说明

c.对象的声明

d.类中的方法

1)什么是方法:声明在类中的函数即方法
2)方法的分类:对象方法、类方法、静态方法

对象方法
class Person:
    """人类"""
    #========属性========
    #========对象方法========
    def  eat(self, food):
        print('人吃'+ food)
        self.study()

    def study()
        print('学习')

p1.eat('苹果') #   p1->self    苹果->food
类方法
class Person:
    """人类"""
    #========属性========
    #========类型方法========
    @classmethod
    def destroy(cls):
        print('人类破坏环境')

  Person.destroy()
静态方法
class Person:
    """人类"""
    #========属性========
    #========类型方法========
    @staticmethod
    def beat_animal():
        print('人类打架')

Person.beat_animal()

声明类的时候方法的选择

①对象方法:实现函数的功能需要对象属性的时候,就使用对象方法。
②类方法:实现函数功能不需要对象属性,但是需要类的字段,使用类方法。
③静态方法:实现函数的功能既不需要对象属性,也不需要类相关的操作,就使用静态方法。

init方法(构造方法)

e.属性

属性的分类:对象属性、字段

字段
对象属性

练习: 声明一个学生类,拥有属性:名字、电话、年龄、学号。拥有功能:学习(打印XXX在学XXX)

class Students:
    numbers = 1000
    def __init__(self,name, tel, age, number):
        self.name = name
        self.tel = tel
        self.age = age
        self.number = number

    def study(self, discipline:str):
        print('共有'+str(Students.numbers)+'学生')
        print(self.name + '在学' + discipline)


student1 = Students('张三', 123, 18, 1)
student1.study('python')

属性的操作
对象的增删改查只针对单个对象
①查

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

dog1 = Dog('大黄')
print(dog1.name)
# print(dog1.name2)  #AttributeError: 'Dog' object has no attribute 'name2'
print(getattr(dog1, 'name2', '无名' ))

②增、改

dog1.gender = '雌'
print(dog1.gender)
dog1.name = '贝贝'
print(dog1.name)
setattr(dog1, 'name', '白色')
delattr(dog1, 'gender')
del dog1.name

f.内置类的属性

创建类的时候,系统默认为我们添加的类的属性

①__name __:字段

类.__name__

②__doc __:字段

类.__doc__

③__class __:对象属性

对象.__class__

④__dict __:字段/对象属性

对象.__dict__
类.__dict__

⑤__module __ :字段

类.__module__

⑥__bases __ :字段

类.__bases__

⑥__str __ ; __repr __ (重要)

#单独打印一个的效果
def __str__(self):
  return str(self.__dict__)[1:-1]  
# 对象作为元素的时候的打印效果
def __repr__(self):
  return 'abc'

⑥slots魔法 :字段

__slots__ = ('name', 'age')

G.私有/保护(重要)

#练习:给age属性添加getter和setter,获取年龄的时候拿到年龄值,和这个年龄对应的阶段
#给age赋值的时候必须是整数且范围在0-150,如果不满足要求,报错:AgeError


class AgeError(Exception):
    def __str__(self):
        return '年龄请输入数字且在0-150之间'


class Human:
    def __init__(self):
        self._age = 0

    @property
    def age(self):
        if self._age < 18:
            return self._age, '少年'
        elif 18 <= self._age < 30:
            return self._age, '青年'
        elif 30 <= self._age < 50:
            return self._age,'中年'
        else:
            return self._age, '老年'

    @age.setter
    def age(self, x):
        if not isinstance(x, int):
            raise AgeError
        elif not 0 <= x <= 150:
            raise AgeError
        self._age =x


h = Human()
# h.age =151
# h.age = '10'
h.age = 10
age, jieduan =h.age
print(h.age)

H.继承

①什么是继承:让子类直接拥有父类的属性和方法

②怎么继承

class 子类(父类列表):
    类的内容

③子类中添加内容

def __init__(self):
  super().__init__()  #继承父类的__init__
注意:当出现多继承时,会继承所有父类的字段和方法,但是只会继承第一个父类的对象方法

I.运算符重载

上一篇 下一篇

猜你喜欢

热点阅读