Python学习笔记25(类与对象,单例)

这篇博客详细介绍了Python面向对象编程的四个核心概念:封装、继承、多态和单例。通过实例展示了如何定义类、创建对象、使用魔法函数`__init__`以及如何实现公有和私有成员。此外,还讲解了单例模式的实现,确保类只有一个实例。这些内容对于理解Python面向对象编程至关重要。
摘要由CSDN通过智能技术生成

类的功能

  • 封装
  • 继承
  • 多态

封装

  • 使用关键字 class 定义 Python 类,关键字后面紧跟类的名称、分号和类的实现,可以将多种方法放在一个类里,方便使用
class Turtle:  # Python中的类名约定以大写字母开头
    # 方法
    def climb(self):
        print('我正在很努力的向前爬...')
    def run(self):
        print('我正在飞快的向前跑...')
    def bite(self):
        print('咬死你咬死你!!')
    def eat(self):
        print('有得吃,真满足...')
    def sleep(self):
        print('困了,睡了,晚安,zzz')

tt = Turtle()
tt.climb()
# 我正在很努力的向前爬...
tt.run()
# 我正在飞快的向前跑...
tt.bite()
# 咬死你咬死你!!

继承

  • 子类自动共享父类之间数据和方法的机制,当
    继承父类后,自己如是没有像相关的方法,便可以调用父类的方法
class list:
	def a(self):
		print('aa')
class MyList(list): #加入括号内就为继承
    pass

lst = MyList([1, 5, 2, 7, 8])
lst.a()
# 'aa'

魔法函数__init__()

  • 传入不同的参数,同一个方法得到不同的结果,每次都需要重新调用类和放法
class Ball:
    def __init__(self, name):
        self.name = name

    def kick(self):
        print("我叫%s,该死的,谁踢我..." % self.name)

a = Ball("球A")
b = Ball("球B")
c = Ball("球C")
a.kick()
# 我叫球A,该死的,谁踢我...
b.kick()
# 我叫球B,该死的,谁踢我...

公有私有

  • 定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了,私有函数不能再外部直接调用,需要在类里面再建一个方法才能私有函数调用
class JustCounter:
    __secretCount = 0  # 私有变量
    publicCount = 0  # 公开变量

    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print(self.__secretCount)


counter = JustCounter()
counter.count()  # 1
counter.count()  # 2
print(counter.publicCount)  # 2

# Python的私有为伪私有
print(counter._JustCounter__secretCount)  # 2 
print(counter.__secretCount)  
# AttributeError: 'JustCounter' object has no attribute '__secretCount'
class Site:
    def __init__(self, name, url):
        self.name = name  # public
        self.__url = url  # private

    def who(self):
        print('name  : ', self.name)
        print('url : ', self.__url)

    def __foo(self):  # 私有方法
        print('这是私有方法')

    def foo(self):  # 公共方法
        print('这是公共方法')
        self.__foo()


x = Site('老马的程序人生', 'https://blog.csdn.net/LSGO_MYP')
x.who()
# name  :  老马的程序人生
# url :  https://blog.csdn.net/LSGO_MYP

x.foo()
# 这是公共方法
# 这是私有方法

x.__foo()
# AttributeError: 'Site' object has no attribute '__foo'

单例

  • 一个人改变了其中的数据,在其之后其他人拿到的数据就是被修改的数据
# 单例
class Singleton:
    # 类属性 (只会初始化一次)
    instance = None
    # 永远开辟一片空间
    def __new__(cls, *args, **kwargs):
        # cls: 类名
        if cls.instance == None:
            cls.instance = super().__new__(cls, *args, **kwargs)
        return cls.instance

p1 = Singleton()
p1.name = '张三'
p2 = Singleton()
print(p2.name)   # 张三
p2.name='李四'
p3 = Singleton()
print(p3.name)  # 李四
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Weidong He.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值