Python面向对象

本文详细介绍了Python的面向对象编程,包括面向对象编程的概念、类和对象的定义、类的初始化、访问可见性、封装原则,以及面向对象的进阶内容如@property装饰器、__slots__、静态方法和类方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

一.面向对象编程

**
1.官方版:把一组数据结构和处理它们的方法组成对象,把相同行为的对象归纳为类,通过类的封装隐藏内部细节,通过继承实现类的特化和泛化,通过多态实现基于对象类型的动态分派。
2.民间版:所谓编程就是程序员按照计算机的工作方式控制计算机完成各种任务。
程序中的数据和操作数据的函数是一个逻辑上的整体,我们称之为“对象”,而我们解决问题的方式就是创建出需要的对象并向对象发出各种各样的消息,多个对象的协同工作最终可以让我们构造出复杂的系统来解决现实中的问题。

二.类和对象

1.类与对象:类是对象的模板,而对象是类的实例。其中类是抽象的概念,对象是具体的东西。
世间万物皆对象
2.定义类
(1)关键字:‘class’
例题1:输出“Hello”
代码:

# 1
class class_name(object):
    print('Hello')

if __name__ =="__main__":
    jocker = class_name

# 运行结果:
# Hello

# 2
class class_name(object):
    def __init__(self):
        self.a = 1000
    
    def A(self):
        print(self.a) # self提供了管道
        print('shy aju koi')

if __name__ =="__main__":
    jocker = class_name()  # ()就相当于走了初始化__init__函数
    jocker.A()  # 在类中调用需要使用 "."

# 运行结果:
# 1000
# shy aju koi

注意
(1)__init__是一个特殊方法用于在创建对象时进行初始化操作。
(2)真正的类需要重写init函数。

例题2.进度条
代码:

# 1:下载进度100%
import time
class Jocker(object):
    def __init__(self):
        pass
    def jindutiao(self):
        for i in range(1,101):
            time.sleep(0.5)
            print('#'*(i),'%d %%'%i)

if __name__ =="__main__":
    Jocker = Jocker()
    Jocker.jindutiao()

# 2:20个#,下载进度还是100%
import time
class Jocker(object):
    def __init__(self):
        self.count = 1
    def jindutiao(self):
        for i in range(0,100):
            time.sleep(0.1)
            if i % 5 ==0:
                res = '#'*self.count
                print('%s %d%%'%(res,(i+5)))
                self.count += 1

if __name__ =="__main__":
    Jocker = Jocker()
    Jocker.jindutiao()

注意
写在类中的函数,被称之为方法,这些方法就是对象可以接受的消息。

3**.类传参**:
代码:

class Jocker(object):
    def __init__(self,num):
        self.a = num
        print(self.a)

if __name__ =="__main__":
    Jocker =Jocker(10)

# 运行结果:
# 10

4.创建和使用对象
在定义一个类之后,就可以创建对象并给对象发消息。
代码:

def main():
    # 创建学生对象并指定姓名和年龄
    stu1 = Student('骆昊', 38)
    # 给对象发study消息
    stu1.study('Python程序设计')
    # 给对象发watch_av消息
    stu1.watch_av()
    stu2 = Student('王大锤', 15)
    stu2.study('思想品德')
    stu2.watch_av()


if __name__ == '__main__':
    main()

三.访问可见性

对象的属性为私有的或受保护的(不允许外界访问)
对象的方法通常都是公开的。
如果希望属性是私有的,在给属性命名时可以用两个		   下划线作为开头。
如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。

1.公有变量外部可调用
代码:

class class_name:
    def __init__(self):
        self.a = 1000

    def A(self):
        print(self.a)

if __name__=="__main__":
    name = class_name()
    name.A()
    print(name.a)

# 运行结果:
# 1000
# 1000

2.私有变量仅内部可调
代码:

class class_name:
    def __init__(self):
        self.__a = 1000

    def A(self):
        print(self.__a)

if __name__=="__main__":
    name = class_name()
    name.A()
    print(name.a)

# 运行结果:
# AttributeError: 'class_name' object has no attribute 'a'

3.私有函数内部可调
代码:

class class_name:
    def __init__(self):
        self.__a = 1000

    def A(self):
        print(self.a)
        print(self.__B())
    def __B(self):
        print('Hello B')

if __name__=="__main__":
    name = class_name()
    name.A()

# 运行结果:
# AttributeError: 'class_name' object has no attribute 'a'

4.外部调用私有变量
5.面向对象的支柱:封装、继承和多态
封装:隐藏一切可以隐藏的实现细节,只向外界暴露(提供)简单的编程接口。

四.面向对象进阶

1.@property装饰器
代码:

class Person(object):

    def __init__(self, name, age):
        self._name = name
        self._age = age

    @property  #  访问器 - getter方法
    def name(self):
        return self._name

    @property
    def age(self):
        return self._age

    @age.setter  #  修改器 - setter方法
    def age(self, age):
        self._age = age

    def play(self):
        if self._age <= 16:
            print('%s正在玩飞行棋.' % self._name)
        else:
            print('%s正在玩斗地主.' % self._name)

	def main():
	    person = Person('王大锤', 12)
	    person.play()
	    person.age = 22
	    person.play()
	    	
if __name__ == '__main__':
	    main()

# 运行结果:
# 王大锤正在玩飞行棋.
# 王大锤正在玩斗地主

2.练习:
代码:

class A(object):
    def __init__(self):
        self.a = 1000

    def A1(self):
        print('A1')

class B(A):
    def __init__(self):
        A.__init__(self)

    def B1(self):
        print(self.a)
        self.A1()

if __name__ == "__main__":
    b = B()
    b.B1()

# 运行代码:
# 1000
# A1

3.__slots__魔法
限定自定义类型的对象,只对当前类的对象生效,对子类并不起任何作用
代码:

class Joker:
    __slots__ = ('uuu','hhh')
    def __init__(self):
        pass

if __name__ == "__main__":
    joker = Joker()
    joker.uuu = 200000
    print(joker.uuu)

# 运行结果:
# 200000

4.静态方法和类方法
代码:

class Jocker(object):
    
    def __init__(self):
        self.a = 1000
    def A(self):
        print(self.a)

if __name__ == "__main__":
    jocker = Jocker()
    jocker.A()

# 运行结果:
# 1000

方法的第一个参数约定名为cls,它代表的是当前类相关的信息的对象,通过这个参数我们获取和类相关的信息并且可以创建出类的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值