__dict__方法
在这种情况下,有必要打印出对象的各种属性。但是不同对象的属性名不一样,结构也不一样,不可能写一个代码来实现。然后找到了__dict__,利用这个属性,可以动态获取对象的所有属性,不包括公共属性。
class Teacher(object):
display = "教师" # 有公有属性
def __init__(self,name,age,course,salary):
self.name = name
self.age = age
self.course = course
self.__salary = salary # 也有私有属性
# 在定义一个别的类
class Student(object):
display = "学生"
def __init__(self,name,sid,classes,score):
self.name = name
self.sid = sid
self.calssed = classes
self.__score = score
def print_obj(obj):
"打印对象的所有属性"
print(obj.__dict__)
t1 = Teacher("Jerry",36,"Python",20000)
s1 = Student('Barry',12,"python01","B")
print_obj(t1)
print_obj(s1)
通过__dict__,可以动态获取对象的所有属性。得到的是一个字典,属性名是字典的键,属性值是字典的值。从输出中也可以得到私有属性,但是不包括公共属性。
然后,如果只需要属性值,则可以重新编写字典。回顾字典的3个方法:
·
dict.items() :用元祖来存放key和vlaue
·
dict.keys() : 只包含key
·
dict.values() : 只包含value
以上三个方法返回的是一个可迭代对象,可以用for遍历,但不是迭代器,不能使用next方法。
然后用下面的方法打印
# 直接用字典了
dict1 = {'name': 'Jerry', 'age': 36, 'course': 'Python', '_Teacher__salary': 20000}
# 先看一下3个方法返回的可迭代对象
print(dict1.items())
print(dict1.keys())
print(dict1.values())
# 用下面的方法输出
print('\n'.join(('%s:%s' % item for item in dict1.items()))) # 每行一对key和value,中间是分号
print(' '.join(('%s' % item for item in dict1.keys()))) # 所有的key打印一行
print(' '.join(('%s' % item for item in dict1.values()))) # 所有的value打印一行
最后拆分一下打印的时候用到的方法
a = dict1.items() 这个是可迭代对象,可以用for遍历
b = ("%s:%s"%item for item in a) 用for循环遍历a,每一项是一个元组,将元组转换成"%s:%s"的字符串形式。最外层的 ( ) 被转换为迭代器。你也可以使用 [ ] 将其转换为列表。
c = ‘\n’.join(b) 最后用join()方法完成字符串的拼接
__str__方法
我找到了一个更好用的方法,我可以获取公共属性。 __str__方法是在打印这个对象的时候打印__str__方法的返回值,而不是打印对象的内存地址:
class Teacher(object):
display = "教师" # 有公有属性
def __init__(self,name,age,course,salary):
self.name = name
self.age = age
self.course = course
self.__salary = salary # 也有私有属性
def __str__(self): # 定义打印对象时打印的字符串
return " ".join(str(item) for item in (
self.display,self.name,self.age,self.course,self.__salary))
class Student(object):
display = "学生"
def __init__(self,name,sid,classes,score):
self.name = name
self.sid = sid
self.calssed = classes
self.__score = score
def __str__(self): # 其实一般可能都是这样简单用一下的
return self.name
t1 = Teacher("Jerry",36,"Python",20000)
s1 = Student('Barry',12,"python01","B")
print(t1)
print(s1)
这里要注意,返回值必须是字符串,所以必须传递一个数据类型
return " ".join(str(item) for item in (self.display,self.name,self.age,self.course,self.__salary)) 这个也可以这么写
return "%s %s %s %s %s"%(self.display,self.name,self.age,self.course,self.__salary) 虽然很容易理解,但是前面的%s数一定与以下变量相同。如果要添加或减去 1 个变量,则必须更改前后。
__str__ 方法可以完全自定义自身对象的输出格式。既然是自定义方法,也可以通过参数来控制。但是调用的时候好像没地方填参数。
其实print调用对象的时候,系统已经自动帮我们把print指向了__str__方法,也就是说print(t1)实际上执行的是print(t1.__str__()),我们可以在这个地方自己写time Full,然后添加参数。
class Teacher(object):
display = "教师" # 有公有属性
def __init__(self,name,age,course,salary):
self.name = name
self.age = age
self.course = course
self.__salary = salary # 也有私有属性
def __str__(self,print_all=False): # 定义打印对象时打印的字符串
if print_all:
return " ".join(str(item) for item in (
self.display,self.name,self.age,self.course,self.__salary))
else:
return self.name
class Student(object):
display = "学生"
def __init__(self,name,sid,classes,score):
self.name = name
self.sid = sid
self.calssed = classes
self.__score = score
def __str__(self): # 其实一般可能都是这样简单用一下的
return self.name
t1 = Teacher("Jerry",36,"Python",20000)
s1 = Student('Barry',12,"python01","B")
print(t1)
print(s1)
print(t1.__str__()) # 这个和上面的效果是一样的
print(t1.__str__(True)) # 现在可以带上参数了
其实这里并没有打印所有的属性,而是我们自定义了打印的内容。但是自定义的位置在类中,所有的属性都可以在类中获取。
终极方法
其实以上两种方法是一起使用的。其实有上面两种方法应该就够了,不过既然想通了,还是留个记录吧。
我先提一点。定义了__str__方法后,虽然打印的字符串是字符串,但其他时候传递的值仍然是对象。如果你想获取打印的值而不是对象,那么使用对象__str__()来传递,下面是最终的例子:
class Teacher(object):
display = "教师" # 有公有属性
def __init__(self,name,age,course,salary):
self.name = name
self.age = age
self.course = course
self.__salary = salary # 也有私有属性
def __str__(self,print_all=False): # 定义打印对象时打印的字符串
if print_all:
return ' '.join(('%s' % item for item in self.__dict__.values()))
else:
return self.name
t1 = Teacher("Jerry",36,"Python",20000)
print(t1)
print(t1.__str__())
print(t1.__str__(True))
t1_obj = t1 # 虽然print的时候打印的是字符串,但是别的时候还是会把对象传过去的
print(t1_obj,type(t1_obj)) # 直接打印看不出来,但是可以看看数据类型
print(t1_obj.name,t1_obj.age) # 确实内取到对象里的属性
t1_str = t1.__str__() # 要传字符串,还差直接用__str__来获取
print(t1_str,type(t1_str)) # 这里获取到的就是字符串类型了
众多
,尽在python学习网,欢迎在线学习!
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python如何不将行切换到输出?11/17
- ♥ python将任务添加到协程10/11
- ♥ python3格式输出有哪些方法?12/30
- ♥ 哪个更简单,python或c10/09
- ♥ python配置日志记录11/25
- ♥ python中的点是什么09/26
内容反馈