当前位置: 首页 > news >正文

营销型网站建站教程绿色系的网站

营销型网站建站教程,绿色系的网站,域名注册网站查询,定制平台1.property装饰器 之前有讨论过#xff0c; Python中属性和方法访问权限的问题#xff0c;不建议将属性设置为私有的#xff0c;倘若直接将属性暴露给外界也是存在问题的。例如#xff0c;我们没有办法检查赋给属性的值是否有效。之前的建议是将属性命名以单下划线开头property装饰器 之前有讨论过 Python中属性和方法访问权限的问题不建议将属性设置为私有的倘若直接将属性暴露给外界也是存在问题的。例如我们没有办法检查赋给属性的值是否有效。之前的建议是将属性命名以单下划线开头通过这种方式来暗示属性是受保护的不建议外界直接访问。倘若想访问属性可以通过属性的getter访问器和setter修改器方法进行对应的操作。如果要做到这点就可以考虑使用property包装器来包装getter和setter方法使得对属性的访问既安全又方便代码如下所示。 class Person(object):def __init__(self, name, age):self._name nameself._age age# 访问器 - getter方法propertydef name(self):return self._name# 访问器 - getter方法propertydef age(self):return self._age# 修改器 - setter方法age.setterdef age(self, age):self._age agedef play(self):if self._age 16:print(%s正在玩飞行棋. % self._name)else:print(%s正在玩斗地主. % self._name)def main():person Person(Maxwell, 26)person.play()person.age 28person.play()# person.name 大傻 # AttributeError: cant set attributeif __name__ __main__:main() 2.__slots__魔法 Python是一门动态语言。通常动态语言允许我们在程序运行时给对象绑定新的属性或方法当然也可以对已经绑定的属性和方法进行解绑定。但是如果我们需要限定自定义类型的对象只能绑定某些属性可以通过在类中定义__slots__变量来进行限定。需要注意的是__slots__的限定只对当前类的对象生效对子类并不起任何作用。 class Person(object):# 限定Person对象只能绑定_name, _age和_gender属性__slots__ (_name, _age, _gender)def __init__(self, name, age):self._name nameself._age agepropertydef name(self):return self._namepropertydef age(self):return self._ageage.setterdef age(self, age):self._age agedef play(self):if self._age 16:print(%s正在玩飞行棋. % self._name)else:print(%s正在玩斗地主. % self._name)def main():person Person(Maxwell, 26)person.play()person._gender 男# AttributeError: Person object has no attribute _is_gay# person._is_gay True 3.静态方法和类方法 之前我们在类中定义的方法都是对象方法也就是说这些方法都是发送给对象的消息。实际上我们写在类中的方法并不需要都是对象方法例如我们定义一个“三角形”类通过传入三条边长来构造三角形并提供计算周长和面积的方法但是传入的三条边长未必能构造出三角形对象因此我们可以先写一个方法来验证三条边长是否可以构成三角形这个方法很显然就不是对象方法因为在调用这个方法时三角形对象尚未创建出来因为都不知道三条边能不能构成三角形所以这个方法是属于三角形类而并不属于三角形对象的。我们可以使用静态方法来解决这类问题代码如下所示。 from math import sqrtclass Triangle(object):def __init__(self, a, b, c):self._a aself._b bself._c cstaticmethoddef is_valid(a, b, c):return a b c and b c a and a c bdef perimeter(self):return self._a self._b self._cdef area(self):half self.perimeter() / 2return sqrt(half * (half - self._a) *(half - self._b) * (half - self._c))def main():a, b, c 3, 4, 5# 静态方法和类方法都是通过给类发消息来调用的if Triangle.is_valid(a, b, c):t Triangle(a, b, c)print(t.perimeter())# 也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数# print(Triangle.perimeter(t))print(t.area())# print(Triangle.area(t))else:print(无法构成三角形.)if __name__ __main__:main() 和静态方法比较类似Python还可以在类中定义类方法类方法的第一个参数约定名为cls它代表的是当前类相关的信息的对象类本身也是一个对象有的地方也称之为类的元数据对象通过这个参数我们可以获取和类相关的信息并且可以创建出类的对象代码如下所示。 from time import time, localtime, sleepclass Clock(object):数字时钟def __init__(self, hour0, minute0, second0):self._hour hourself._minute minuteself._second secondclassmethoddef now(cls):ctime localtime(time())return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)def run(self):走字self._second 1if self._second 60:self._second 0self._minute 1if self._minute 60:self._minute 0self._hour 1if self._hour 24:self._hour 0def show(self):显示时间return %02d:%02d:%02d % \(self._hour, self._minute, self._second)def main():# 通过类方法创建对象并获取系统时间clock Clock.now()while True:print(clock.show())sleep(1)clock.run()if __name__ __main__:main() 4.类之间的关系 简单的说类和类之间的关系有三种is-a、has-a和use-a关系。 is-a关系也叫继承或泛化比如学生和人的关系、手机和电子产品的关系都属于继承关系。has-a关系通常称之为关联比如部门和员工的关系汽车和引擎的关系都属于关联关系关联关系如果是整体和部分的关联那么我们称之为聚合关系如果整体进一步负责了部分的生命周期整体和部分是不可分割的同时同在也同时消亡那么这种就是最强的关联关系我们称之为合成关系。use-a关系通常称之为依赖比如司机有一个驾驶的行为方法其中的参数使用到了汽车那么司机和汽车的关系就是依赖关系。 我们可以使用一种叫做UML统一建模语言的东西来进行面向对象建模其中一项重要的工作就是把类和类之间的关系用标准化的图形符号描述出来。关于UML我们在这里不做详细的介绍有兴趣的读者可以自行阅读《UML面向对象设计基础》一书。 利用类之间的这些关系我们可以在已有类的基础上来完成某些操作也可以在已有类的基础上创建新的类这些都是实现代码复用的重要手段。复用现有的代码不仅可以减少开发的工作量也有利于代码的管理和维护这是我们在日常工作中都会使用到的技术手段。 5.继承和多态 之前提到过可以在已有类的基础上创建新类这其中的一种做法就是让一个类从另一个类那里将属性和方法直接继承下来从而减少重复代码的编写。提供继承信息的我们称之为父类也叫超类或基类得到继承信息的我们称之为子类也叫派生类或衍生类。子类除了继承父类提供的属性和方法还可以定义自己特有的属性和方法所以子类比父类拥有的更多的能力在实际开发中我们经常会用子类对象去替换掉一个父类对象这是面向对象编程中一个常见的行为对应的原则称之为里氏替换原则。下面我们先看一个继承的例子。 class Person(object):人def __init__(self, name, age):self._name nameself._age agepropertydef name(self):return self._namepropertydef age(self):return self._ageage.setterdef age(self, age):self._age agedef 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 gradepropertydef grade(self):return self._gradegrade.setterdef grade(self, grade):self._grade gradedef 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 titlepropertydef title(self):return self._titletitle.setterdef title(self, title):self._title titledef teach(self, course):print(%s%s正在讲%s. % (self._name, self._title, course))def main():stu Student(Maxwell, 26, 大四)stu.study(数学)stu.watch_av()t Teacher(Max, 38, 砖家)t.teach(Python程序设计)t.watch_av()if __name__ __main__:main() 子类在继承了父类的方法后可以对父类已有的方法给出新的实现版本这个动作称之为方法重写override。通过方法重写我们可以让父类的同一个行为在子类中拥有不同的实现版本当我们调用这个经过子类重写的方法时不同的子类对象会表现出不同的行为这个就是多态poly-morphism。 from abc import ABCMeta, abstractmethodclass Pet(object, metaclassABCMeta):宠物def __init__(self, nickname):self._nickname nicknameabstractmethoddef make_voice(self):发出声音passclass Dog(Pet):狗def make_voice(self):print(%s: 汪汪汪... % self._nickname)class Cat(Pet):猫def make_voice(self):print(%s: 喵...喵... % self._nickname)def main():pets [Dog(旺财), Cat(凯蒂), Dog(大黄)]for pet in pets:pet.make_voice()if __name__ __main__:main() 在上面的代码中我们将Pet类处理成了一个抽象类所谓抽象类就是不能够创建对象的类这种类的存在就是专门为了让其他类去继承它。Python从语法层面并没有像Java或C#那样提供对抽象类的支持但是我们可以通过abc模块的ABCMeta元类和abstractmethod包装器来达到抽象类的效果如果一个类中存在抽象方法那么这个类就不能够实例化创建对象。上面的代码中Dog和Cat两个子类分别对Pet类中的make_voice抽象方法进行了重写并给出了不同的实现版本当我们在main函数中调用该方法时这个方法就表现出了多态行为同样的方法做了不同的事情。  6.综合案例 案例1奥特曼打小怪兽。 from abc import ABCMeta, abstractmethod from random import randint, randrangeclass Fighter(object, metaclassABCMeta):战斗者# 通过__slots__魔法限定对象可以绑定的成员变量__slots__ (_name, _hp)def __init__(self, name, hp):初始化方法:param name: 名字:param hp: 生命值self._name nameself._hp hppropertydef name(self):return self._namepropertydef hp(self):return self._hphp.setterdef hp(self, hp):self._hp hp if hp 0 else 0propertydef alive(self):return self._hp 0abstractmethoddef attack(self, other):攻击:param other: 被攻击的对象passclass Ultraman(Fighter):奥特曼__slots__ (_name, _hp, _mp)def __init__(self, name, hp, mp):初始化方法:param name: 名字:param hp: 生命值:param mp: 魔法值super().__init__(name, hp)self._mp mpdef attack(self, other):other.hp - randint(15, 25)def huge_attack(self, other):究极必杀技(打掉对方至少50点或四分之三的血):param other: 被攻击的对象:return: 使用成功返回True否则返回Falseif self._mp 50:self._mp - 50injury other.hp * 3 // 4injury injury if injury 50 else 50other.hp - injuryreturn Trueelse:self.attack(other)return Falsedef magic_attack(self, others):魔法攻击:param others: 被攻击的群体:return: 使用魔法成功返回True否则返回Falseif self._mp 20:self._mp - 20for temp in others:if temp.alive:temp.hp - randint(10, 15)return Trueelse:return Falsedef resume(self):恢复魔法值incr_point randint(1, 10)self._mp incr_pointreturn incr_pointdef __str__(self):return ~~~%s奥特曼~~~\n % self._name \生命值: %d\n % self._hp \魔法值: %d\n % self._mpclass Monster(Fighter):小怪兽__slots__ (_name, _hp)def attack(self, other):other.hp - randint(10, 20)def __str__(self):return ~~~%s小怪兽~~~\n % self._name \生命值: %d\n % self._hpdef is_any_alive(monsters):判断有没有小怪兽是活着的for monster in monsters:if monster.alive 0:return Truereturn Falsedef select_alive_one(monsters):选中一只活着的小怪兽monsters_len len(monsters)while True:index randrange(monsters_len)monster monsters[index]if monster.alive 0:return monsterdef display_info(ultraman, monsters):显示奥特曼和小怪兽的信息print(ultraman)for monster in monsters:print(monster, end)def main():u Ultraman(骆昊, 1000, 120)m1 Monster(狄仁杰, 250)m2 Monster(白元芳, 500)m3 Monster(王大锤, 750)ms [m1, m2, m3]fight_round 1while u.alive and is_any_alive(ms):print(第%02d回合 % fight_round)m select_alive_one(ms) # 选中一只小怪兽skill randint(1, 10) # 通过随机数选择使用哪种技能if skill 6: # 60%的概率使用普通攻击print(%s使用普通攻击打了%s. % (u.name, m.name))u.attack(m)print(%s的魔法值恢复了%d点. % (u.name, u.resume()))elif skill 9: # 30%的概率使用魔法攻击(可能因魔法值不足而失败)if u.magic_attack(ms):print(%s使用了魔法攻击. % u.name)else:print(%s使用魔法失败. % u.name)else: # 10%的概率使用究极必杀技(如果魔法值不足则使用普通攻击)if u.huge_attack(m):print(%s使用究极必杀技虐了%s. % (u.name, m.name))else:print(%s使用普通攻击打了%s. % (u.name, m.name))print(%s的魔法值恢复了%d点. % (u.name, u.resume()))if m.alive 0: # 如果选中的小怪兽没有死就回击奥特曼print(%s回击了%s. % (m.name, u.name))m.attack(u)display_info(u, ms) # 每个回合结束后显示奥特曼和小怪兽的信息fight_round 1print(\n战斗结束!\n)if u.alive 0:print(%s奥特曼胜利! % u.name)else:print(小怪兽胜利!)if __name__ __main__:main() 案例2扑克游戏。 import randomclass Card(object):一张牌def __init__(self, suite, face):self._suite suiteself._face facepropertydef face(self):return self._facepropertydef suite(self):return self._suitedef __str__(self):if self._face 1:face_str Aelif self._face 11:face_str Jelif self._face 12:face_str Qelif self._face 13:face_str Kelse:face_str str(self._face)return %s%s % (self._suite, face_str)def __repr__(self):return self.__str__()class Poker(object):一副牌def __init__(self):self._cards [Card(suite, face) for suite in ♠♥♣♦for face in range(1, 14)]self._current 0propertydef cards(self):return self._cardsdef shuffle(self):洗牌(随机乱序)self._current 0random.shuffle(self._cards)propertydef next(self):发牌card self._cards[self._current]self._current 1return cardpropertydef has_next(self):还有没有牌return self._current len(self._cards)class Player(object):玩家def __init__(self, name):self._name nameself._cards_on_hand []propertydef name(self):return self._namepropertydef cards_on_hand(self):return self._cards_on_handdef get(self, card):摸牌self._cards_on_hand.append(card)def arrange(self, card_key):玩家整理手上的牌self._cards_on_hand.sort(keycard_key)# 排序规则-先根据花色再根据点数排序 def get_key(card):return (card.suite, card.face)def main():p Poker()p.shuffle()players [Player(东邪), Player(西毒), Player(南帝), Player(北丐)]for _ in range(13):for player in players:player.get(p.next)for player in players:print(player.name :, end )player.arrange(get_key)print(player.cards_on_hand)if __name__ __main__:main() 案例3工资结算系统。 某公司有三种类型的员工 分别是部门经理、程序员和销售员 需要设计一个工资结算系统 根据提供的员工信息来计算月薪 部门经理的月薪是每月固定15000元 程序员的月薪按本月工作时间计算 每小时150元 销售员的月薪是1200元的底薪加上销售额5%的提成from abc import ABCMeta, abstractmethodclass Employee(object, metaclassABCMeta):员工def __init__(self, name):初始化方法:param name: 姓名self._name namepropertydef name(self):return self._nameabstractmethoddef get_salary(self):获得月薪:return: 月薪passclass Manager(Employee):部门经理def get_salary(self):return 15000.0class Programmer(Employee):程序员def __init__(self, name, working_hour0):super().__init__(name)self._working_hour working_hourpropertydef working_hour(self):return self._working_hourworking_hour.setterdef working_hour(self, working_hour):self._working_hour working_hour if working_hour 0 else 0def get_salary(self):return 150.0 * self._working_hourclass Salesman(Employee):销售员def __init__(self, name, sales0):super().__init__(name)self._sales salespropertydef sales(self):return self._salessales.setterdef sales(self, sales):self._sales sales if sales 0 else 0def get_salary(self):return 1200.0 self._sales * 0.05def main():emps [Manager(刘备), Programmer(诸葛亮),Manager(曹操), Salesman(荀彧),Salesman(吕布), Programmer(张辽),Programmer(赵云)]for emp in emps:if isinstance(emp, Programmer):emp.working_hour int(input(请输入%s本月工作时间: % emp.name))elif isinstance(emp, Salesman):emp.sales float(input(请输入%s本月销售额: % emp.name))# 同样是接收get_salary这个消息但是不同的员工表现出了不同的行为(多态)print(%s本月工资为: %s元 %(emp.name, emp.get_salary()))if __name__ __main__:main() 7.Github: Python-100-Days-Maxwell/Day01-15/code at main · psmaxwell/Python-100-Days-Maxwell · GitHub 8.Code 1.association.py The connection releationship during objectsVersion:0.1 Author: Maxwell Date: 2024-05-06from math import sqrtclass Point(object):def __init__(self, x0, y0):self._x xself._y ydef move_to(self, x, y):self._x xself._y ydef move_by(self, dx, dy):self._x dxself._y dydef distance_to(self, other):dx self._x - other._xdy self._y - other._yreturn sqrt(dx ** 2 dy ** 2)def __str__(self):return (%s, %s) % (str(self._x),str(self._y))class Line(object):def __init__(self, startPoint(0, 0), endPoint(0, 0)):self._start startself._end endpropertydef start(self):return self._startstart.setterdef start(self, start):self._start startpropertydef end(self):return self.endend.setterdef end(self, end):self._end endpropertydef length(self):return self._start.distance_to(self._end)if __name__ __main__:p1 Point(3, 5)print(p1)p2 Point(-2, -1.5)print(p2)line Line(p1, p2)print(line.length)line.start.move_to(2, 1)line.end Point(1, 2)print(line.length)2.car1.py the use of attributions -- acessor/modifier/deleter -- use __slots__ to limit for attributions.Version: 0.1 Author: Maxwell Date: 2024-05-06 class Car(object):__slots__ (_brand, _max_speed)def __init__(self, brand, max_speed):self.brand brandself._max_speed max_speedpropertydef brand(self):return self._brandbrand.setterdef brand(self, brand):self._brand brandbrand.deleterdef brand(self):del self._brandpropertydef max_speed(self):return self._max_speedmax_speed.setterdef max_speed(self, max_speed):if max_speed 0:raise ValueError(Invalid max speed for car)self._max_speed max_speeddef __str__(self):return Car: [品牌%s, 最高时速%d] % (self._brand, self._max_speed)car Car(QQ, 120) print(car) #ValueError # car.max_speed -100 car.max_speed 320 car.brand Benz # use __slots__ attribute to limit the following code will be generated exception. # car.current_speed 80 print(car) # if deletor be provided, we can execute the following code. # del car.brand # the dream of the attribution. print(Car.brand) print(Car.brand.fget) print(Car.brand.fset) print(Car.brand.fdel) 3.car2.py 属性的使用 - 使用已有方法定义访问器/修改器/删除器Version: 0.1 Author: Maxwell Date: 2024-05-06 class Car(object):def __init__(self, brand, max_speed):self.set_brand(brand)self.set_max_speed(max_speed)def get_brand(self):return self._branddef set_brand(self, brand):self._brand branddef get_max_speed(self):return self._max_speeddef set_max_speed(self, max_speed):if max_speed 0:raise ValueError(Invalid max speed for car)self._max_speed max_speeddef __str__(self):return Car: [品牌%s,最高时速%d] % (self._brand, self._max_speed)# 用已有的修饰器和访问器定义属性brand property(get_brand, set_brand)max_speed property(get_max_speed, set_max_speed)car Car(QQ, 120) print(car)# ValueError # car.max_speed -100 car.max_speed 320 car.brand Benz print(car) print(Car.brand) print(Car.brand.fget) print(Car.brand.fset) 倘若您觉得我写的好那么请您动动你的小手粉一下我你的小小鼓励会带来更大的动力。Thanks.
http://www.w-s-a.com/news/580523/

相关文章:

  • 给分管领导网站建设情况汇报怎么写网络运营的岗位职责及任职要求
  • 电线电缆技术支持中山网站建设广告设计培训学校有哪些
  • 如何禁止通过ip访问网站wordpress无法调用主题布局和图片
  • 江西建设工程信息网站重庆网站推广大全
  • 南浔区住房城乡建设局网站网页设计基础学什么
  • 萧山做网站的企业网站建设 西安
  • 江西省城乡建设厅网站百度站长资源平台
  • 本地搭建linux服务器做网站免费查企业信息查询
  • 电商网站建设与运营网上购物哪个网站最好
  • 做app做网站从何学起网站设计需要什么证
  • 设计网站最重要的是要有良好的短网址还原
  • 大连建设银行招聘网站做seo是要先有网站吗
  • 中山做网站的wordpress建站教程百科
  • 湛江专业网站制作做网站需要工具
  • 做音箱木工网站吉林平安建设网站
  • 品牌网站建设咨询灯光设计网站推荐
  • 温州网站运营打开百度一下网页版
  • 网站有情链接怎么做住房公积金个体工商户
  • 内蒙古网站开发网站开发验收资料
  • 温州网站建设首选国鼎网络网络营销方法可分为两类
  • 做张家界旅游网站多少钱企业推广网络营销
  • 代做毕设网站推荐广东手机微信网站制作
  • 福州建设工程质量监督网站专业做公司宣传网站的
  • 百度云建站教程网站工程师是做什么的
  • 手机在线制作网站一级消防工程师考试试题及答案
  • 网站设计的需求网页制作教程和素材
  • 徐州网站建设 网站推广WordPress 文章编辑
  • 做什么网站比较受欢迎软件商店下载安装2023版本最新
  • 做ip资讯的网站怎么在wordpress中套用同行网页
  • 医院网站如何备案东莞优化公司收费