python面向对象

面向对象是把构成问题的事务分解成各个对象,每个对象都有自己独立的属性和行为, 对象可以将整个问题事务进行分工, 不同的对象做不同的事情, 这种面向对象的编程思想由于更加贴近实际生活, 所以被计算机语言广泛应用。

> 常见的面向对象编程语言:Java / C++ / Python等等;

>Python中万事万物皆对象,而面向对象的三大特性:封装、继承和多态。

类的定义

Python 中定义一个类使用 class 关键字实现,其基本语法格式如下:
class 类名:
    多个(≥0)类属性...
    多个(≥0)类方法...
>注意,无论是类属性还是类方法,对于类来说,它们都不是必需的,可以有也可以没有。

 实例化对象

对已定义好的类进行实例化

定义类时,如果没有手动添加 `__init__()` 构造方法,又或者添加的 `__init__()` 中仅有一个 self 参数,则创建类对象时的参数可以省略不写
# 1.实例化对象
d1 = Dog()
d2 = Dog()
print(d1)
print(d2)
 

类变量

类变量指的是在类中,但在各个类方法外定义的变量。举个例子:
class Dog:
    name: str="小花"
    type: str="金毛"
    age: int = 3

> 上述代码中,name和age都是类变量。类变量的特点是,所有类的实例化对象都同时共享类变量,也就是说,类变量在所有实例化对象中是作为公用资源存在的。类方法的调用方式有 2 种,既可以使用类名直接调用,也可以使用类的实例化对象调用。

- 通过类名调用类变量和修改类变量的值:
# 使用类名直接调用
print(f"name={Dog.name},type={Dog.type},age={Dog.age}")
# 修改类变量的值
Dog.name="钱多多"
print(Dog.name)

- 通过类对象来调用所属类中的类变量:(**此方式不推荐使用**)
# 实例化对象
d1 = Dog()
# 获取对象中的属性
print(f"name={d1.name},age={d1.age}")
# 修改对象中的属性
d1.name="小黑"
d1.gender="公"
print(f"name={d1.name},gender={d1.gender}")

> **注意:通过类对象是无法修改类变量的。通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量**

函数和实例变量
实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量,其特点是只作用于调用方法的对象。另外,实例变量只能通过对象名访问,无法通过类名访问。

class Dog:
    name: str="小花"
    type: str="金毛"
    age: int = 3
    
    def say(self):
        pass
 

 __init__()构造函数

在创建类时,我们可以手动添加一个 `__init__()` 方法,该方法是一个特殊的类实例方法,称为构造方法(或构造函数)。

构造方法用于创建对象时使用,每当创建一个类的实例对象时,Python解释器都会自动调用它。Python类中,手动添加构造方法的语法格式如下:
def __init__(self,...):
    代码块

> 注意,此方法的方法名中,开头和结尾各有 2 个下划线,且中间不能有空格。

定义类时,如果没有手动添加 `__init__()` 构造方法,又或者添加的 `__init__()` 中仅有一个 self 参数,则创建类对象时的参数可以省略不写,如下所示:
class Dog:
    
    def __init__(self):
        print("实例化")
        
d = Dog()
 

封装

简单的理解封装(Encapsulation),即在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”(或者“类对象.方法名(参数)”)的形式调用这些属性(或方法),而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。

通过添加 __ 修饰符将变量声明为私有化属性。
class Dog:
    name: str = '小黑'
    age: int = 3
    __sex: str = '公'

被修饰的变量无法再类的外部被访问,但是可以通过 self 对象来调用。
# 提供getter/setter
def get_sex(self):
    return self.__sex

def set_sex(self, sex: str):
    self.__sex = sex

d = Dog()
print(d.get_sex())

继承

Python 中,实现继承的类称为子类,被继承的类称为父类(也可称为基类、超类)。

子类继承父类时,只需在定义子类时,将父类(可以是多个)放在子类之后的圆括号里即可。语法格式如下:
class 类名(父类1, 父类2, ...):
    #类定义部分
 

> 注意,如果该类没有显式指定继承自哪个类,则默认继承 object 类(object 类是 Python 中所有类的父类,即要么是直接父类,要么是间接父类)。另外,Python 的继承是多继承机制(和 C++一样),即一个子类可以同时拥有多个直接父类。
class Father(object):
    height=180
    money=100
    def work(self):
        print("会工作")
    pass

class Mother(object):
    fact='漂亮'
    money=90
    def cook(self):
        print("会做饭")
    pass

class Son(Father,Mother):
    pass

# 创建son的实例
s=Son()
s.cook()
s.work()
print(s.fact)
print(s.height)
print(s.money)

> 同时继承 Father类和 Mother类时,Father类在前,当属性和方法重复时,越往前优先级越高。

查看继承关系

```python
print(Dog.__bases__)
print(Dog.__mro__)
 

 多态
class Animal(object):
    def play(self):
        pass

class Tiger(Animal):
    def play(self):
        print("正在表演老虎后脚直立行走")


class Lion(Animal):
    def play(self):
        print("正在表演狮子跳火圈")


class Person(object):
    def show(self, a: Animal):# 声明父类类型,传入子类类型
        print("动物表演开始了")
        a.play()# 多态
 

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值