python对象初始化方法_Python面向对象编程——__init()__方法

隐式基类object

每个python类都隐式继承object

全文代码实例实现:枚举扑克牌的花色和牌面值

一、_init()__方法:对象初始化

显示而非隐式:__init()__应显示展示初始化变量

对象被实例化时,先创建一个空对象,然后再调用__init()__对对象内部变量或其他内容进行初始化

二、_init()__方法用例:

(一)基类实现初始化

1 classCard:2 def __init__(self, rank, suit):3 self.rank =rank4 self.suit =suit5 self.hard, self.soft =self._points()6

7

8 classNumberCard(Card):9 def_points(self):10 returnint(self.rank), int(self.rank)11

12

13 classAceCard(Card):14 def_points(self):15 return 1, 11

16

17

18 classFaceCard(Card):19 def_points(self):20 return 10, 10

三个子类共享公共初始化逻辑

多态:三个子类对_points(self)都有不同的功能实现

改进:子类实现__init()__方法

1 classCard:2 def __init__(self, rank, suit, hard, soft):3 self.rank =rank4 self.suit =suit5 self.hard =hard6 self.soft =soft7

8

9 classNumberCard(Card):10 def __init__(self, rank, suit):11 super().__init__(str(rank), suit, rank, rank)12

13

14 classAceCard(Card):15 def __init__(self, rank, suit):16 super().__init__('A', suit, 1, 11)17

18

19 classFaceCard(Card):20 def __init__(self, rank, suit):21 super().__init__({1: 'A', 11: 'J', 12: 'Q', 13: 'K'}[rank], suit, 10, 10)

super():用于子类要调用父类的同名方法时

单继承:

直接在同名函数中调用super().fun_name()

多继承:

直接在同名函数中调用super(要调用某父类的前一个类名, self).fun_name()

(二)创建常量清单

#牌的字符与名称

classSuit:def __init__(self, name, symbol):

self.name=name

self.symbol= symbol

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 Club, Diamond, Heart, Spade = Suit('Club', 'C'), Suit('Diamond', 'D'),\2 Suit('Heart', 'H'), Suit('Spade', 'S')

调用

二、工厂函数

实现工厂函数的两种途径

定义一个函数,返回不同类的对象

定义一个类,包含创建对象的方法

途径一:

1 defcard1(rank, suit):2 if rank == 1:3 return AceCard('A', suit)4 elif 2 <= rank <= 10:5 returnNumberCard(str(rank), suit)6 elif rank == 11:7 return FaceCard('J', suit)8 elif rank == 12:9 return FaceCard('Q', suit)10 elif rank == 13:11 return FaceCard('K', suit)

上述函数实现了牌面值与花色的对应

三、使用映射和类来简化设计

(一)并行映射

1 defcard2(rank, suit):2 #在集合中查找rank, 未查到到返回NumberCard

3 class_ = {1: AceCard, 11: FaceCard, 12: FaceCard, 13: FaceCard}.get(rank,4 NumberCard)5 rank_str = {1: 'A', 11: 'J', 12: 'Q', 13: 'K'}.get(rank, str(rank))6 return class_(rank_str, suit)

缺点:映射键1、11、12、13逻辑重复,使用两次映射来获取牌面值和花色。重复的代码是多余的,提高了维护成本

(二)二元组映射

1 #二元组映射

2 defcard3(rank, suit):3 class_, rank_str = {1: (AceCard, 'A'), 11: (FaceCard, 'J'), 12: (FaceCard, 'Q'),4 13: (FaceCard, 'K')}.get(rank, (NumberCard, str(rank)))5 return class_(rank_str, suit)

(三)partial函数:偏函数

使用方法:调用函数fun_name(arg1,arg*.....)

fun_name1=partial(fun_name, arg1…)

fun_name1(arg*…) 偏函数

from functools importpartialdefcard4(rank, suit):

part_class= {1: partial(AceCard, 'A'), 11: partial(FaceCard, 'J'),12: partial(FaceCard, 'Q'), 13: partial(FaceCard, 'K')}\

.get(rank, partial(NumberCard, str(rank)))return part_class(suit)

(四)工厂流畅API

结合二元组映射实现API,该对象顺序调用

1 classCardFactory:2 defrank(self, rank):3 self.class_, self.rank_str ={4 1: (AceCard, 'A'),5 11: (FaceCard, 'J'),6 12: (FaceCard, 'Q'),7 13: (FaceCard, 'K')8 }.get(rank, (NumberCard, str(rank)))9 returnself10

11 defsuit(self, suit):12 return self.class_(self.rank_str, suit)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,初始化方法__init__是一个特殊的方法,它用于初始化一个类的实例对象。当我们创建一个类的实例时,Python会自动调用__init__方法,并将实例对象作为self参数传递给__init__方法。 在__init__方法中,我们通常会对实例对象的属性进行初始化,以便在后续的方法中可以使用这些属性。例如,我们可以在__init__方法中为对象设置初始状态、初始化属性、创建对象的内部状态等。__init__方法通常不返回任何值。 下面是一个使用__init__方法的示例,我们定义了一个名为Person的类,并在__init__方法中为实例对象设置了name和age两个属性: ```python class Person: def __init__(self, name, age): self.name = name self.age = age def say_hi(self): print('Hello, my name is', self.name, 'and I am', self.age, 'years old.') p = Person('Tom', 25) p.say_hi() ``` 在上面的代码中,我们定义了一个Person类,并在__init__方法中为实例对象设置了name和age两个属性。在say_hi方法中,我们通过self.name和self.age访问了对象的name和age属性,并将它们打印出来。当我们创建一个名为Tom、年龄为25的Person实例时,Python会自动调用__init__方法,并将实例对象作为self参数传递给__init__方法,然后在__init__方法中为实例对象设置name和age属性。 需要注意的是,__init__方法是一个可选的方法,如果我们不定义该方法,则Python会使用默认的__init__方法。默认的__init__方法不会做任何事情,只是将实例对象创建出来。但是,在实际开发中,我们通常会定义__init__方法初始化实例对象的属性,以便后续方法可以使用这些属性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值