知行编程网知行编程网  2022-12-03 14:00 知行编程网 隐藏边栏  109 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于python如何输出所有属性的相关知识,包括python输出列表某个值,以及python输出值这些编程知识,希望对大家有参考作用。


python如何输出所有属性


__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学习网,欢迎在线学习!

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享