Python-面向对象编程-类和对象

定义类

  • 所有类名首字母要求大写,多个单词时遵循驼峰命名法
  • 所有未定义父类的类都继承object

格式:class 类名[(父类)]: 

#两种方式意思相同
class Person:
    pass

class Person(object):
    pass

定义类和属性

name、age、subject就是类属性

class Student:
    #类属性
    name = ''
    age = 0
    subject = []

类中方法

对象方法(普通方法)

格式:
def 方法名(self[,parm1,parm2...]):
    pass

self就是对象本身

class Student:
    # 类属性
    name = 'student'
    age = 0
    subject = []

    # 普通方法
    def study(self):
        print(self.name, '正在学习...')

xiaoming = Student()
xiaoming.name = 'xiaoming'
xiaoming.study()

------------
输出:
xiaoming 正在学习...
class Student:
    # 类属性
    name = 'student'
    age = 0
    subject = []

    # 普通方法
    def study(self, name):
        print(name, '正在学习...')

s1 = Student()
s1.study('xiaohong')

----------------
输出:
xiaohong 正在学习...

类方法

格式:
@classmethod
def 方法名(cls):
    pass
  • 类方法使用@classmethod装饰器 
  • 对象方法传入的是self,类方法传入的是cls
  • 类方法可以直接用类调用,或者可以用类的实例(对象)调用

class Dog:
    dog_type = '阿拉斯加'

    def __init__(self, nickname):
        self.name = nickname

    def dog_run(self):
        print('{}在公园里跑.看起来是一只{}.'.format(self.name, self.dog_type))

    @classmethod
    def dog_sit(cls):
        print(cls.dog_type, '很乖,坐下了')

dog1 = Dog('肉丸')
dog1.dog_type = '小泰迪'
dog1.dog_run()
Dog.dog_sit()

--------------
输出:
肉丸在公园里跑.看起来是一只小泰迪.
阿拉斯加 很乖,坐下了

静态方法

  • 静态方法使用装饰器@staticmethod
  • 静态方法没有参数
  • 当方法跟类属性和对象属性都没有关系的时候,使用静态方法
  • 支持对象和类名直接调用
class Dog:
    def __init__(self, nickname):
        self.name = nickname

    @staticmethod
    def dog_sit():
        print('很乖,坐下了')

dog1 = Dog('肉丸')
dog1.dog_sit()
Dog.dog_sit()

---------------------
输出:
很乖,坐下了
很乖,坐下了

魔术方法

3. Data model — Python 3.7.12 documentationhttps://docs.python.org/3.7/reference/datamodel.html#special-method-names

格式:
def __方法名__(self):
    pass

__init__() 初始化函数        

  • 如果没有__init__。直接利用类向内存申请一个和类一样的空间,给到对象。
  • 如果有__init__。利用类向内存申请一个和类一样空间,内存空间(self)传递给__iniy__,执行__init__的函数。最后将内存空间给到对象。

__new__()构造函数

class Robot():
    def __init__(self, name):
        print('---init阶段---')
        print('给机器人一个自己的名字')
        self.name = name
        print('机器人:', self.name)
        print('查看内存地址:', self)

    def __new__(cls, *args, **kwagrs):
        print('---构造一个机器人对象---')
        result = super().__new__(cls)
        print('构造成功')
        print('查看开辟的内存地址:', result)
        return result

robot1 = Robot('小P')

----------------
输出:
---构造一个机器人对象---
构造成功
查看开辟的内存地址: <__main__.Robot object at 0x000002069F7938C8>
---init阶段---
给机器人一个自己的名字
机器人: 小P
查看内存地址: <__main__.Robot object at 0x000002069F7938C8>
  • __new__()构造函数会先于__init__()初始化函数执行,无论编写顺序。__new__()会构建类,开辟内存地址然后传给__init()
  • 我们创建一个类的时候,虽然我们没有写,但是系统会首先调用__new__()构造函数

关于__new()__构造函数使用场景和更多解析,我们单独用一篇博客去探索。

__call__()

将对象当作函数时,调用__call__()

class Robot():
    def __call__(self):
        print('调用__call__')

robot1 = Robot()
robot1()

------------------
输出:
调用__call__

__del__()析构函数

触发时机:当对象在内存中被销毁时,会被执行。(整个程序执行结束;函数执行结束;主动del删除对象)

作用:在对象被销毁时,执行一些操作。

import time

class Robot():
    # 析构函数
    def __del__(self):
        print('---这是一个析构函数---')

def fx():
    robot1 = Robot()
    print('此函数将要睡2秒')
    for i in range(1, 3):
        print('第{}秒'.format(i))
        time.sleep(1)

fx()
print('函数执行结束')

------------
输出:
此函数将要睡2秒
第1秒
第2秒
---这是一个析构函数---
函数执行结束

__str__()

正常情况下,实例化对象后打印对象,会返回对象的内存地址。但是这个对于开发者来说没有实际的意义,获取不到更多信息。

class Robot():
    def __init__(self):
        self.name = '擎天柱'

robot1 = Robot()
print(robot1)

--------------
输出:
<__main__.Robot object at 0x0000014C20ED4FC8>

可以用__str__()输出有用的信息

class Robot():
    def __init__(self):
        self.name = '擎天柱'

    def __str__(self):
        return '这是一个机器人对象,非常无敌'

robot1 = Robot()
print(robot1)

----------
输出:
这是一个机器人对象,非常无敌

对象

创建对象

格式:对象名 = 类名()

class Student:
    #类属性
    name = ''
    age = 0
    subject = []

xiaoming = Student()

对象属性

  • 当创建了对象时,对象会继承类的属性。获取属性的时候,也是从类中获取属性。
  • 当对默认的类属性赋值后(对象名.属性 = xxxx),属性才会变成对象属性。
class Student:
    # 类属性
    name = 'student'
    age = 0
    subject = []

xiaoming = Student()
print('类属性:', xiaoming.name)  # 此时是从类中获取的类属性
xiaoming.name = 'xiaoming'  # 因为赋值了,此时变成了对象属性
print('对象属性:', xiaoming.name)

-------------
输出:
类属性: student
对象属性: xiaoming

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值