《Python程序设计与算法基础教程(第⼆版)》江红余青松,第九章课后习题
答案
推荐阅读
⽂章⽬录
例9.1~例9.53
补充:类名为有效的标识符,⼀般为多个单词组成的名称,每个单词除第⼀个字母⼤写外,其余的字母均⼩写
⼀:类对象和实例对象
例9.1(创建类对象和实例对象)
>>>class Person:
pass
>>> p = Person()
>>>print(Person,type(Person),id(Person))
<class'__main__.Person'><class'type'>2096437524072
>>>print(p,type(p),id(p))
<__main__.Person object at 0x000001E81DA88BC8><class'__main__.Person'>2096441625544
例9.2(实例对象的创建和使⽤)
Python创建实例对象的⽅法⽆须使⽤关键字new,⽽是直接像调⽤函数⼀样调⽤类对象并传递参数,因此类对象是可调⽤对象(Callable)
在Python内置函数中,bool、float、int、str、list、dict、set等均为可调⽤内置类对象
>>> c =complex(1,2)
>>> c.conjugate()
(1-2j)
>>> c.real
1.0
⼆:属性
例9.3(定义实例属性)
Python变量不需要声明,可直接使⽤。所以建议⽤户在类定义的开始位置初始化类属性,或者在构造函数__init__()中初始化实例属性
>>>class Person:
def__init__(self, name, age):
self.name = name
myeclipse是免费的吗self.age = age
def say_hi(self):
print("您好,我叫", self.name)
>>> p = Person('zgh',18)
>>> p.say_hi()
您好,我叫 zgh
>>>print(p.age)
18
例9.4(定义类对象属性)
类属性如果通过obj.属性名来访问,则属于该实例地实例属性
>>>class Person:
count =0
name ="Person"
>>> unt +=1
>>>unt)
1
>>>print(Person.name)
Person
>>> p1 = Person(); p2 = Person()
>>>print(p1.name, p2.name)
Person Person
>>> Person.name ="雇员"
>>>print(p1.name, p2.name)
雇员雇员
>>> p1.name ='员⼯'
>>>print(p1.name, p2.name)
员⼯雇员
例9.5(私有属性)
Python类的成员没有访问控制限制,这与其他⾯向对象语⾔不同
通常约定以两个下划线开头,但是不以两个下划线结束的属性是私有的(private),其它为公共的(public)
>>>class Person:
__name ='class Person'
def get_name():
print(Person.__name)
>>> _name()
class Person
>>> Person.__name
在线telnet工具
Traceback (most recent call last):
File "<pyshell#46>", line 1,in<module>
Person.__name
AttributeError:type object'Person' has no attribute '__name'
例9.6、9.7、9.8(property装饰器)
⾯向对象编程的封装性原则要求不直接访问类中的数据成员
在Python中可以定义私有属性,然后定义相应的访问该私有属性的函数,并使⽤@property装饰器来装饰这些函数
程序可以把函数“当作”属性访问,从⽽提供更加友好的访问⽅式农产品数据中心
>>>class Person:
def__init__(self, name):
self.__name = name
struts2指纹@property
def name(self):
return self.__name
>>> p = Person('zgh666')
>>>print(p.name)
zgh666
尝试了⼀个想法(如果对象也有⼀个同名的属性,会怎么样?):
>>>class Person:
name ='zgh'
def__init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
>>> p = Person('zgh666')
>>>print(p.name)
zgh666
很显然,返回的是装饰器修饰的name函数
@property装饰器默认提供⼀个只读属性,如果需要,可以使⽤对应的getter、setter和deleter装饰器实现其他访问器函数
>>>class Person:
def__init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
self.__name = value
@name.deleter
def name(self):
del self.__name
>>> p = Person('zgh')
>>> p.name ='Zhanggguohao'
>>>print(p.name)
Zhanggguohao
property(fget=None, fset=None, fdel=None, doc=None)
>>>class Person:
def__init__(self, name):
self.__name = name
def getname(self):
return self.__name
def setname(self, value):
self.__name = value
def delname(self):
del self.__name
name =property(getname, setname,delname,"I'm the 'name' property.")
>>> p = Person('zgh')
>>>print(p.name)
zgh
>>> p.name ='zgh666'
>>>print(p.name)
zgh666
例9.9(⾃定义属性)
在Python中,可以赋予⼀个对象⾃定义的属性,即类定义中不存在的属性。对象通过特殊属性__dict__存储⾃定义属性
>>>class Person:
pass
>>> p = Person()use sqlyog
>>> p.name ='custom name'
>>> p.name
'custom name'
>>> p.__dict__
{'name':'custom name'}
通过重载__getattr__和__setattr__可以拦截对成员的访问,从⽽⾃定义属性的⾏为
__getattr__()只有在访问不存在的成员时才会被调⽤
__getattribute__()拦截所有的(包括不存在)获取操作
__setattr__()设置属性
__delattr__()删除属性
>>>class CustomAttribute(object):
def__init__(self):
pass
def__getattribute__(self, name):
return str.upper(object.__getattribute__(self, name))
def__setattr__(self, name, value):
object.__setattr__(self, name,str.strip(value))
>>> p = CustomAttribute()
>>> p.firstname =' mary'
>>>print(p.firstname)
MARY
三:⽅法
对象实例⽅法的第⼀个参数⼀般为self,但是⽤户调⽤时不需要也不能给该参数传值
例9.11(静态⽅法:摄⽒温度与华⽒温度之间的相互转换)
class TemperatureConverter:
@staticmethod
def c2f(t_c):
return(float(t_c)*9/5)+32
@staticmethod
def f2c(t_f):
return((float(t_f)-32)*5/9)
print("1. 从摄⽒温度到华⽒温度.")
print("2. 从华⽒温度到摄⽒温度.")
choice =int(input("请选择转换⽅向:"))python入门教程2
if choice ==1:
t_c =float(input("请输⼊摄⽒温度:"))
t_f = TemperatureConverter.c2f(t_c)
print("华⽒温度为:{0:.2f}".format(t_f))
elif choice ==2:
t_f =float(input("请输⼊华⽒温度:"))
t_c = TemperatureConverter.f2c(t_f)
print("摄⽒温度为:{0:.2f}".format(t_c))
else:
print("⽆此选项,只能选择1或2")
输出:
====================== RESTART: D:\zgh\desktop\test.py ======================
1.从摄⽒温度到华⽒温度.
2.从华⽒温度到摄⽒温度.
请选择转换⽅向:1
请输⼊摄⽒温度:30
华⽒温度为:86.00
>>>
====================== RESTART: D:\zgh\desktop\test.py ======================
1.从摄⽒温度到华⽒温度.
2.从华⽒温度到摄⽒温度.
请选择转换⽅向:2
请输⼊华⽒温度:70
摄⽒温度为:21.11
>>>
补充⼀个很有意思的代码:
(包含了很多知识点)
TempStr =input("请输⼊带有符号的温度值:")
if TempStr[-1]in['F','f']:
C =(eval(TempStr[0:-1])-32)/1.8
print("转化后的温度是{:.2f}C".format(C))
elif TempStr[-1]in['C','c']:
F =1.8*eval(TempStr[0:-1])+32
print("转化后的温度是{:.2f}F".format(F))
else:
print("输⼊格式错误")
例9.12(类⽅法)
类⽅法的第⼀个参数为cls,但是调⽤时⽤户不需要也不能给该参数传值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论