美文网首页
Python从新手到大师——09:python函数参数私有化

Python从新手到大师——09:python函数参数私有化

作者: 远航天下 | 来源:发表于2018-08-24 10:34 被阅读0次

代码一

#! /usr/bin/env python
"""
@Time     : 2018/8/23 15:03
@Author   : Damao
@Site     : Life is short. I use python.
@File     : test1.py
@Software : PyCharm

"""
"""访问(读取和重新赋值)类私有属性的安全方法"""

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

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

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

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

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

    def play(self):
        if self._age <= 20:
            print("{a}正在玩耍!".format(a=self._name))
        else:
            print("{a}正在学习!".format(a=self._name))


if __name__ == '__main__':
    p = Person("大毛",98)
    p.play()
    print(p.age)
    p.age = 1
    p.name = "dsf"
    print(p.name)
    p.play()

代码二

#! /usr/bin/env python
"""
@Time     : 2018/8/23 15:30
@Author   : Damao
@Site     : Life is short. I use python.
@File     : test2.py
@Software : PyCharm

"""
"""使用__slots__魔法方法限定类的某些属性(只作用于当前类,对子类不起作用)"""

class Person(object):

    # 限定Person对象只能绑定_name, _age和_gender属性
    __slots__ = ('_name','_age','_gender','_hh','_jjj')

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

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

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

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

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

    def play(self):
        if self._age <= 20:
            print("{a}正在玩耍!".format(a=self._name))
        else:
            print("{a}正在学习!".format(a=self._name))


if __name__ == '__main__':
    p = Person("bdby",1)
    p.play()
    p._gender = 'male'
    p._hh = 1
    p._jjj = 100
    # p._oo = 77  # 报错:AttributeError: 'Person' object has no attribute '_oo'
    print(p._gender)
    print(p._hh)
    print(p._jjj)

代码三

#! /usr/bin/env python
"""
@Time     : 2018/8/23 15:44
@Author   : Damao
@Site     : Life is short. I use python.
@File     : test3.py
@Software : PyCharm

"""

"""静态方法"""
from math import sqrt


class Triangle(object):
    def __init__(self,a,b,c):
        self._a = a
        self._b = b
        self._c = c

    @staticmethod   # is_triangle为静态方法,属于三角形类,而不属于三角形对象
    def is_triangle(a,b,c):
        is_t = a + b > c and b + c > a and a + c > b
        return is_t

    def perimeter(self):
        p = self._a + self._b + self._c
        return p

    def area(self):
        half = self.perimeter() / 2
        t_area = sqrt(half * (half - self._a) * (half - self._b) * (half - self._c))
        return t_area


if __name__ == '__main__':
    if Triangle.is_triangle(3,4,5):
        t = Triangle(3,4,5,)
        print("周长是:{a}".format(a=t.perimeter()))
        print("面积是:",t.area())
    else:
        print("无法构成三角形!")

代码四

#! /usr/bin/env python
"""
@Time     : 2018/8/23 16:10
@Author   : Damao
@Site     : Life is short. I use python.
@File     : test4.py
@Software : PyCharm

"""
"""类方法"""

from time import time, localtime, sleep
import os


class Clock(object):
    """数字时钟"""

    def __init__(self, hour=0, minute=0, second=0):
        self._hour = hour
        self._minute = minute
        self._second = second

    @classmethod
    def now(cls):
        now_time = localtime(time())
        return cls(now_time.tm_hour,now_time.tm_min,now_time.tm_sec)

    def run(self):
        """走字"""
        self._second += 1
        if self._second == 60:
            self._second = 0
            self._minute += 1
            if self._minute == 60:
                self._minute = 0
                self._hour += 1
                if self._hour == 24:
                    self._hour = 0

    def show(self):
        """显示时间"""
        return '%02d:%02d:%02d' % \
               (self._hour, self._minute, self._second)

if __name__ == '__main__':
    clock = Clock.now()
    while True:
        os.system("cls")
        print(clock.show())
        sleep(1)
        clock.run()

代码五

#! /usr/bin/env python
"""
@Time     : 2018/8/23 16:33
@Author   : Damao
@Site     : Life is short. I use python.
@File     : test5.py
@Software : PyCharm

"""
"""类的继承"""

class Person(object):
    """人"""

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

    @property
    def name(self):
        return self._name

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

    @age.setter
    def age(self, age):
        self._age = age

    def play(self):
        print('%s正在愉快的玩耍.' % self._name)

    def watch_av(self):
        if self._age >= 18:
            print('%s正在观看爱情动作片.' % self._name)
        else:
            print('%s只能观看《熊出没》.' % self._name)


class Student(Person):
    """学生"""

    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self._grade = grade

    @property
    def grade(self):
        return self._grade

    @grade.setter
    def grade(self, grade):
        self._grade = grade

    def study(self, course):
        print('%s的%s正在学习%s.' % (self._grade, self._name, course))


class Teacher(Person):
    """老师"""

    def __init__(self, name, age, title):
        super().__init__(name, age)
        self._title = title

    @property
    def title(self):
        return self._title

    @title.setter
    def title(self, title):
        self._title = title

    def teach(self, course):
        print('%s%s正在讲%s.' % (self._name, self._title, course))


if __name__ == '__main__':
    stu = Student('王大锤', 15, '初三')
    stu.study('数学')
    stu.watch_av()
    t = Teacher('大毛', 38, '老叫兽')
    t.teach('Python程序设计')
    t.watch_av()

代码六

#! /usr/bin/env python
"""
@Time     : 2018/8/23 16:38
@Author   : Damao
@Site     : Life is short. I use python.
@File     : test6.py
@Software : PyCharm

"""
"""类的多态(同样的方法做了不同的事情)"""

from abc import ABCMeta, abstractmethod


class Pet(object, metaclass=ABCMeta):
    """宠物"""
    def __init__(self, nickname):
        self._nickname = nickname

    @abstractmethod
    def make_voice(self):
        """发出声音"""
        pass


class Dog(Pet):
    """狗"""
    def make_voice(self):
        print('%s: 汪汪汪...' % self._nickname)


class Cat(Pet):
    """猫"""
    def make_voice(self):
        print('%s: 喵...喵...' % self._nickname)


if __name__ == '__main__':
    pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')]
    for pet in pets:
        pet.make_voice()

代码七

#! /usr/bin/env python
"""
@Time     : 2018/8/24 10:37
@Author   : Damao
@Site     : Life is short. I use python.
@File     : test7.py
@Software : PyCharm

"""
from random import randrange
import time

"""
目标:玩扑克游戏
设计思路:一张牌;一副牌;4个玩家
"""
class OneCard(object):
    def __init__(self,colour,size):
        self._colour = colour
        self._size = size

    @property
    def colour(self):
        return self._colour

    @property
    def size(self):
        return self._size

    def __str__(self):  # __str__打印就是reture这个里面的数据
        all_colour = ('♠', '♥', '♣', '♦')
        if self._size == 1:
            size_str = 'A'
        elif self._size == 11:
            size_str = 'J'
        elif self._size == 12:
            size_str = 'Q'
        elif self._size == 13:
            size_str = 'K'
        else:
            size_str = self._size
        return "{a}{b}".format(a=all_colour[self._colour],b=size_str)


class Poker(object):
    def __init__(self):
        self._cards = []
        self._current = 0
        for col in range(4):
            for siz in range(1,14):
                card = OneCard(colour=col,size=siz)
                self._cards.append(card)

    @property
    def cards(self):
        return self._cards

    def shuffle_cards(self):
        """
        洗牌
        :return:
        """
        self._current = 0
        cards_len = len(self._cards)
        for i in range(cards_len):
            random_i = randrange(cards_len)
            self._cards[i],self._cards[random_i] = self._cards[random_i],self._cards[i]

    @property
    def send_card(self):
        """
        发牌
        :return:
        """
        card = self._cards[self._current]
        self._current += 1
        return card

    @property
    def is_any_card(self):
        """
        还有没有剩余牌
        :return:
        """
        return self._current < len(self._cards)


class Palyer(object):
    def __init__(self,name):
        """
        :param name: 玩家姓名
        :param name_has_card: 玩家手里卡片
        """
        self._name = name
        self._name_has_card = []

    @property
    def name(self):
        return self._name

    @property
    def name_has_card(self):
        return self._name_has_card

    def get_card(self,card):
        """
        玩家抓牌
        :param card:
        :return:
        """
        self._name_has_card.append(card)

    def arrangment_cards(self,card_key):
        """
        玩家整理手上牌:排序
        :return:
        """
        self._name_has_card.sort(key=card_key)


def get_key(card):
    return (card.colour, card.size)


def main():
    p = Poker()
    p.shuffle_cards()
    players = [Palyer('乔峰'), Palyer('段誉'), Palyer('虚竹'), Palyer('正淳')]
    for _ in range(13):
        for player in players:
            player.get_card(p.send_card)
    for player in players:
        print(player.name + ':', end=' ')
        player.arrangment_cards(get_key)
        for card in player.name_has_card:
            print(card, end=' ')
        print()


if __name__ == '__main__':
    for _ in range(10):
        time.sleep(1)
        main()
        print()

相关文章

网友评论

      本文标题:Python从新手到大师——09:python函数参数私有化

      本文链接:https://www.haomeiwen.com/subject/ewcbiftx.html