求python一个类与对象的代码_python 学习笔记 -- 类与对象

2013年3月24日,python学习第七天。

耐心是一切聪明才智的基础 -- 柏拉图

类简介:

Python的类机制通过最小奥的新语法在语言中实现类。它是C++和Modula-3语言中类机制的混合。

1、类继承机制允许多重继承

2、派生类可以覆盖积累中的任何方法或类

3、可以使用相同的名称调用基类的方法

4、对象可以包含任意数量的私有数据

Python 作用域和命名空间:

1、global 语句用以指明某个特定的变量为全局作用域

2、nonlocal语句用以指明某个变量为封闭变量

代码:

def scope_test():

def do_local():

spam = "local spam"

def do_nonlocal():

nonlocal spam

spam = "nonlocal spam"

def do_global():

global spam

spam = "global spam"

spam = "test spam"

do_local()

print("After local assignment:", spam)

do_nonlocal()

print("After nonlocal assignment:", spam)

do_global()

print("After global assignment:", spam)

scope_test()

print("In global scope:", spam)

类定义:

class ClassName:

.

.

.

类对象:

类对象支持两种操作:属性引用和实例化

0818b9ca8b590ca3270a3433284dd417.png

说明:类的实例化操作创建对象使用了特殊的函数__init__(),类的实例化操作会自动为新建的类实例调用__init__()方法。

类继承:

python类继承的基本语法:

class DerivedClassName(BaseClassName):

.

.

.

当两个类不再同一个作用域时:

class DerivedClassName(modname.BaseClassName):

.

.

.

1、派生类定义的执行和基类是一样的。构造派生类对象时,就记住了基类。这在解析属性引用的时候非常重要:如果在类中找不到请求调用的属性,就是搜索类。如

果基类是由别的类派生而来的,这个规则会递归到应用上。

2、搜索对应类的属性,必要时沿基类链逐级搜索,如果找到了函数对象的这个方法引用就是合法的。

3、派生类可能会覆盖其基类的方法

4、调用基类的方法:BaseClassName.methodname(self, arguments).

5、Python有两个用于继承的函数:1)函数isinstance()用于检查实例类型;2)函数issubclass()用于检查类继承。

多继承:

class DerivedClassName(Base1, Base2, Base3):

.

.

.

1、Python有限的支持多继承形式。详情见www.python.org/download/releases/2.3/mro/

2、在大多数情况下,你能想到的搜索属性从父类继承的深度优先,从左到右,而不是搜索两次在同一个类层次结构中,其中一个重叠。因此,如果在本类中没有找到某个属

性,就会搜索base1,然后递归搜索基类,如果最终没有找到,就是搜索base2,以此类推。

私有变量:

像java等编程语言中在类中定义一个私有变量,不过在python中是不存在这样的语法的。然而,也有一个变通的访问用于大多数Python代码:以一个下划线开头的命名会被处

理为API的非公开部分,它会被视为一个实现细节,无需公开。

迭代器:

迭代器及实现原理

0818b9ca8b590ca3270a3433284dd417.png

在自己的类中使用迭代器:

class Reverse:

"""Iterator for looping over a sequence backwards."""

def __init__(self, data):

self.data = data

self.index = len(data)

def __iter__(self):

return self

def __next__(self):

if self.index == 0:

raise StopIteration

self.index = self.index - 1

return self.data[self.index]

生成器:

生成器是创建迭代器的简单而强大的工具。需要返回数据的时候使用yied语句。每次next()被调用时,生成器回复它脱离的位置。

0818b9ca8b590ca3270a3433284dd417.png

注意:生成器的一个关键功能在于两次执行之间,局部变量和执行状态都是自动的保存下来。

附:(类与对象的一个简单程序)

#!/etc/bin/env python3.1

class Fridge:

def __init__(self, items={}):

if type(items) != type({}):

raise TypeError("fridge required a dictionary but was geven %s" % type(items))

self.items = items

return

def __add_multi(self, food_name,quantity):

if(not food_name in self.items):

self.items[food_name] = 0

self.items[food_name] = self.items[food_name] + quantity

def add_one(self, food_name):

if type(food_name) != type(""):

raise TypeError, "add_one required a string, given a %s" % food_name

else:

self.__add_multi(food_name, 1)

return True

def add_many(self, food_dict):

if type(food_dict) != type({}):

raise TypeError("add_many required a dictionary, got a %" %

food_dict)

for item in food_dict.keys():

self.__add_multi(item, food_dict[item])

return

def has(self, food_name, quantity=1):

return self.has_various({food_name:quantity})

def has_various(self, foods):

try:

for food in foods.keys():

if self.items[food] < foods[food]:

return False

return True

except KeyError:

return False

def __get_multi(self, food_name,quantity):

try:

if (self.items[food_name] is None):

return False

if (quantity > self.items[food_name]):

return False

self.items[food_name] = self.items[food_name] - quantity

except keyError:

return False

return quantity

def get_one(self, food_name):

if type(food_name) != type(""):

raise TypeError("get_one requires a string, given a %s" % type(food_name))

else:

result = self.__get_multi(food_name, 1)

return result

def get_many(self, food_dict):

if self.has_various(food_dict):

foods_removed = {}

for item in food_dict.keys():

foods_removed[item] = self.__get_multi(item, food_dict[item])

return foods_removed

def get_ingredients(self, food):

try:

ingredients = self.get_many(food.__ingredients__())

except AttributeError:

return False

if ingredients != False:

return ingredients

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值