Python学习之类

文章目录

  • 面向对象程序设计
  • 类和实例
  • 类属性和类方法
  • 私有成员与公有成员
  • 类的继承

 

一、面向对象程序设计

“对象”和“对象的属性"的概念最早可以追溯到上世纪20世纪50年代初,它们首先出现在人工智能相关的早起著作中。

面向对象编程是一种重要的程序设计思想,其对于现实世界中的事物所包含的属性和行为进行概念化模型以反映其特征。简单来说就是,设计程序表现出某一对象的特征。这使得编写程序变得简单和容易。

二、类和实例

类是对属于它的对象的模板,而对象是类的一个实例。

1.类,属性和方法

一个类是同一类对象的模板,即属于该类的对象的固定格式。

属性描述了对象的某一方面的特征或状态

方法是对象的行为或操作

例如:

定义一个人的”类“,表示一个人的属性:姓名,性别,年龄等。表示一个人的行为:自我介绍姓名。

class person(object):  #person是类名,object是所有类的父类(后面会提到)

    def __init__(self,name,age,gander):  #红色为参数
        self.name=name   #self.属性名=属性值
        self.age=age
        self.gander=gander

    def introduce_oneself(self,其他参数):  #内部函数即为方法
        print('我的名字是:{}'.format(self.name))

三,类属性、实例属性和类方法

1.类属性:#

类属性独立于任何实例,是类的一个通用变量,一般可以放置类的全局信息,定义一个类属性的一般方法为:

class 类名():
        类属性

2.实例属性(成员)

实例属性定义时以self作为前缀,,只能通过对象名访问

def __init__(self,xxx,xxx)

3.类方法:

类方法可以直接使用类引用,不需要实例化就可以使用的方法。定义如下:

class 类名():
       @classmethod
       def 自定义类方法名(cls,其他参数):
           语句序列

例如:

class person(object):

    num_of_persons=0  #类属性 

   def __init__(self,name,age,gander):   #实例属性
      self.name=name 
      self.age=age
      self.gander=gander
      num_of_person+=1

   @classmethod      #类方法
   def get_num_of_persons(cls):
      return cls.num_of_persons

   def introduce_oneself(self,其他参数): 
      print('我的名字是:{}'.format(self.name))

类方法与私有方法、公有方法和静态方法,私有方法的名字前面有"_"。

私有方法不能在类以外调用。

每个对象都有自己的私有方法和公有方法。

静态方法可以通过类名和对象名调用,但只能访问属于对象的成员,不能直接访问属于对象的成员。

四、私有成员与公有成员

 

私有成员前面有“_”开头,否则为公有成员,私有成员在类的外部不能直接访问,需要调用对象的公有成员来访问,或通过Python提供的特殊方法来访问(但不推荐)。

方法如下:

对象名._类名+私有成员

如:car1._car_weight

私有成员是为了数据封装和保密而设置的属性,一般只能在类的成员方法(类的内部)中使用访问。

class person(object):

     num_of_persons=0  #类属性 

    def __init__(self,name,age,gander):   #实例属性
        self.name=name 
        self._age=age           #私有成员
        self.gander=gander
        num_of_person+=1

   @classmethod      #类方法
   def get_num_of_persons(cls):
      return cls.num_of_persons

   def introduce_oneself(self,其他参数): 
      print('我的名字是:{}'.format(self.name))

五、类的继承

继承就是子类从父类继承一些父类具有的东西。当我们设计一个新类时如果可以继承一个已有的设计良好的类,然后进行二次开发,就会大大减少工作量。

类继承的语法:

class 子类(父类):

         子类成员

继承的特点:

1.父类的构造函数(实例属性)__init__()方法不会被自动调用,需要子类专门调用。

2.调用父类的方法的时候。通过“父类.方法名(self)”的方式。区别在于普通的函数调用不需要带self。

3.在调用方法时,先从子类中查找方法,如果找不到,才会到父类中寻找。这时如果父类的方法不能满足子类的需求,可以在子类调用父类的方法并进行改造。

class  Animal(object):                  #定义父类,父类必须继承于object(可写也可以不写),object是一切父类的父类,否则无法在子类中使用super()函数。

         def run(self):           #父类方法

               print(Animal is running……)    

class Cat(Animal):          #定义子类

        def run(self):            #调用父类的方法

              print(Cat is runing……)     #改造父类的方法

 c=cat()        #子类实例

c.run()         #子类调用重写方法

运行结果如下:

Cat is running……

 

 

类举例:

发牌小游戏

 
#Car module
class Card():
    '''A playing card'''
    rank=['A','2','3','4','5','6','7','8','9','10','J','Q','K']  #牌面1~13
    suit=['梅','方','红','黑']   #花色

    def __init__(self,rank,suit,face_up=True):
        self.rank=rank
        self.suit=suit
        self.is_face_up=face_up   #Ture为牌的正面

    def __str__(self):            #如果牌反了就打印牌的信息
        if self.is_face_up:
            rep=self.suit+self.rank
        else:
            rep='XX'
        return rep

    def pic_order(self):      #牌的花色及数字
        if self.rank=='A':
            FaceNum=1
        elif self.rank=='J':
            FaceNum = 11
        elif self.rank == 'Q':
            FaceNum = 12
        elif self.rank=='K':
            FaceNum = 13
        else:
            FaceNum=int(self.rank)
        if self.suit=='梅':
            Suit=1
        elif self.suit=='方':
            Suit=2
        elif self.suit=='红':
            Suit=3
        else:
            Suit=4


    def flip(self):   unindent does not match any outer indentation level       #翻牌
        self.is_face_up=not self.is_face_up

class Hand():
    '''A hand of playing cards.'''
    def __init__(self):
         self.cards=[]    #储存发到的牌
    def __str__(self):
        if self.cards:
            rep=""
            for card in self.cards:
                rep+=str(card)+"\t"
        else:
            rep='无牌'
        return rep
    def clear(self):      #清空手里的牌
        self.card=[]
    def add(self,card):        #增加牌
        self.cards.append(card)
    def give(self,card,other_hand):       #把一张牌给别人
        self.cards.remove(card)
        other_hand.add(card)


class Poke(Hand):
    '''A deck of playing cards'''
    def populate(self):             #生成一副牌
        for suit in Card.suit:
            for rank in Card.rank:
                self.add(Card(rank,suit))

    def shuffle(self):             #洗牌
        import random
        random.shuffle(self.cards) #打乱牌的顺序

    def deal(self,hands,per_hand=13):   #发牌,默认给每个牌手13张牌
        for rounds in range(per_hand):
            for hand in hands:
                if self.cards:
                    top_card=self.cards[0]
                    self.give(top_card,hand)
                else:
                    print("不能继续发牌了,牌已经发完了!")

if __name__=="__main__":
    print("This is a module with classes for playing cards")
    players=[Hand(),Hand(),Hand(),Hand()]#四个玩家
    pokel=Poke()
    pokel.populate()#生成一副牌
    pokel.shuffle()#洗牌
    pokel.deal(players,13)#给每个牌手发13张牌
    #显示四位牌手的牌
    n=1
    for hand in players:
        print("牌手",n,end=":")
        print(hand)
        n=n+1
    input("\nPress the enter key to exit.")

运行结果如下:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值