Python--面向对象 类与对象

目录

一、面向对象编程

二、面向过程,面向对象的比较

三、类,对象

1.概念

(1)类

(2)对象

2.创建

(1)创建类:大驼峰命名法

(2)创建对象

3.self变量

5.__init__()    初始化方法

6.__str__方法

四、类属性和实例属性

1.类属性是不可变数据类型(静态属性)

2.类属性是可变数据类型

五、类的封装

1.介绍

2.封装的体现

(1)属性私有化:

(2)方法私有化:

3.私有化封装后的限制



一、面向对象编程

Object Oriented Programming    (OOP)

二、面向过程,面向对象的比较

  生活中 程序中    
面向过程

亲力亲为(自己干)

自己做饭吃

函数之间的相互调用

函数为基本结构使用

函数 变量
面向对象

坐享其成(让别人去干,享受成果)

点外卖吃

对象为基本结构 方法 属性

三、类,对象

1.概念

  概念   能不能直接使用
是一群具有相同特征或者行为的事物的统称 抽象 不能直接实用
描述一个类: 行为,特征
对象 是由类创造出来的具体的实体 具体 不能直接使用

(1)类

类是一群具有相同特征或者行为的事物的统称,是抽象的,不能直接使用

描述一个类:行为,特征

类:可以理解为一种事物的模板

(2)对象

是由类创造出来的具体的实体,可以直接使用

2.创建

(1)创建类:大驼峰命名法

格式:

class 类名:

    类的属性

    类的方法

    ....

# 创建类:大驼峰命名法
class Dog:
    def eat(self):
        print('吃骨头...')

    def sleep(self):
        print('睡觉了...')

(2)创建对象

格式:

对象名=类名()

# 创建对象
# 格式:对象名称=类名()
# 一条狗
dog = Dog()
# 调用
dog.sleep()
dog.eat()
print(id(dog))
# 又一条狗
dog1 = dog
print(id(dog))
print(id(dog1))

3.self变量

哪个对象在调用方法或属性,self就是哪个对象

4.在类的外部添加属性

可以这样用,但是不推荐使用

格式:

对象名.属性名=值

5.__init__()    初始化方法

我们可以在此方法中,做一些初始化的操作

创建对象的时候就会自动调用__init__()

class Cat:
    def __init__(self, name):
        print('init方法在创建对象的时候执行')
        self.name = name

    def eat(self):
        print('猫吃老鼠')
        print(self.name)


# 创建对象的时候自动调用__init__(),
bule_cat = Cat('蓝猫')
bule_cat.eat()
black_cat = Cat('黑猫')
black_cat.eat()


# 类的方法里面传的是形参,创建对象传的是实参

6.__str__方法

在没有写__str__()方法的时候,打印对象,会输出对象的地址

class Cat:
    def __init__(self, name, age):
        print('init方法在创建对象的时候执行')
        self.name = name
        self.age = age

    def eat(self):
        print('猫吃老鼠')
        print(self.name)

    # def __str__(self):
    #     msg = 'name的属性值是{},age的属性值是{}'.format(self.name, self.age)
    #     return msg


cat = Cat('蓝猫', 10)
print(cat)  # <__main__.Cat object at 0x0000000001E8D358>

在写了__str__()方法的时候,打印对象,就会输出__str__()里面的内容

class Cat:
    def __init__(self, name, age):
        print('init方法在创建对象的时候执行')
        self.name = name
        self.age = age

    def eat(self):
        print('猫吃老鼠')
        print(self.name)

    def __str__(self):
        msg = 'name的属性值是{},age的属性值是{}'.format(self.name, self.age)
        return msg


cat = Cat('蓝猫', 10)
print(cat)  
# name的属性值是蓝猫, age的属性值是10

四、类属性和实例属性

数据类型   操作 类属性和实例属性的变化情况
不可变数据类型 int   float   str  tuple..... 类属性变化 都变
实例属性发生变化 只有该实例属性变化,其他的都不变
可变数据类型 list   dict    set..... 实例属性调用自己的方法 全都变
实例属性重新赋值

只有实例属性变

重新开辟了一块内存空间

1.类属性是不可变数据类型(静态属性)

2.类属性是可变数据类型


五、类的封装

1.介绍

不让别人看到自己的某些代码,起到保护作用,(不让别人动你的代码)

在开发过程中,保护核心代码,不让外部使用

2.封装的体现

正常代码:

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

    def __str__(self):
        msg = '{}的年龄是{}'.format(self.name, self.age)
        return msg


person = Person('zs', 10)
person.age = -10
print(person)
# zs的年龄是-10

(1)属性私有化:

给类的属性前面加两个下划线:  __

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def __str__(self):
        msg = '{}的年龄是{}'.format(self.__name, self.__age)
        return msg


person = Person('zs', 20)
person.__name = '张三'  # 在类的外面不能修改name的值
print(person)  # zs的年龄是20

私有化之后,类内部可以使用,类外不可以使用,正常修改的方法:

  • 使用 setter,getter,方法
class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def set_age(self, age):
        if age < 0 or age > 150:
            print('输入的年龄不合法...')
            return
        self.__age = age

    def get_age(self):
        return self.__age

    def __str__(self):
        msg = '{}的年龄是{}'.format(self.__name, self.__age)
        return msg


person = Person('zs', 20)
person.set_age(-10)  # 输入的年龄不合法...
ret = person.get_age()
print(ret)  # 20
print(person)  # zs的年龄是20
  • 对象名._类名__属性名=值

(2)方法私有化:

给类的方法前面加两个下划线:  __

# 方法私有化之后,类外面的不能调用,但是类里面可以调用
class CallPhone:
    def __tell(self):
        print('正在通话中...')

    def tell_one(self, money):
        if money > 0:
            self.__tell()  # 在类内部,调用私有化后的方法
        else:
            print('欠费了啊...')
            return


c1 = CallPhone()
c1.tell_one(-1)  # 欠费了啊...
c1.tell_one(10)  # 正在通话中...

3.私有化封装后的限制

位置 可不可以使用
类内部 可以
类外,对象外 不可以
子类,子类对象 不可以

猜你喜欢

转载自blog.csdn.net/g_optimistic/article/details/86299225