python:面向对象进阶

1,反射

反射:使用字符串类型的名字去操作变量

反射就没有安全问题,去操作内存中已经存在的变量

#反射对象中的属性和方法

class A:
    price=20
print(getattr(A,‘price‘))

#反射对象的属性

class A:
    def func(self):
        print(‘in func‘)
a =A()
a.name =‘alex‘

ret =getattr(a,‘name‘)#通过变量名的字符串形式取到的值
print(ret)

#反射对象的方法

ret =getattr(a,‘func‘)
ret()

#反射类的方法:

if hasattr(A,‘func‘)):
    getattr(A,‘func‘)()

#反射类的属性

class A:
    price=20
print(getattr(A,‘price‘))

#反射模块的属性

import my
print(getattr(my,‘day‘))

#反射自己模块中的变量

import sys
print(getattr(sys.modules[‘__main__‘],‘year‘))
getattr(sys.modules[‘__main__‘],‘qqxing‘)()

setattr设置/修改变量

class A:

  pass

setattr(A,‘name‘,‘alex‘)

print(A,name)

delattr删除变量

delattr(a,‘name‘)

2,__str__和__repr__

改变对象的字符串显示__str__,__repr__

自定制格式化字符串__format__

# 双下方法
# obj.__str__  str(obj)
# obj.__repr__ repr(obj)
class Teacher:
    def __init__(self,name,salary):
        self.name =name
        self.salary =salary
    def __str__(self):
        return "Teacher‘s object :%s"%self.name
    def __repr__(self):
        return str(self.__dict__)
    def func(self):
        return ‘wahaha‘
nezha =Teacher(‘nazha‘,250)
print(nazha)
print(repr(nezha))
print(‘>>> %r‘%nezha)
#object  里有一个__str__,一旦被调用,就返回调用这个方法的#对象的内存地址
l = [1,2,3,4,5]   # 实例化 实例化了一个列表类的对象
print(l)
# %s str()  直接打印 实际上都是走的__str__
# %r repr()  实际上都是走的__repr__
# repr 是str的备胎,但str不能做repr的备胎
# print(obj)/‘%s‘%obj/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,那么他返回的必定是一个字符串
# 如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__。
# repr(),只会找__repr__,如果没有找父类的
class Classes:
    def __init__(self,name):
        self.name = name
        self.student = []
    def __len__(self):
        return len(self.student)
    def __str__(self):
        return ‘classes‘
py_s9= Classes(‘python全栈9期‘)
py_s9.student.append(‘二哥‘)
py_s9.student.append(‘泰哥‘)
print(len(py_s9))
print(py_s9)
#__del__
class A:
    def __del__(self):   # 析构函数: 在删除一个对象之前进行一些收尾工作
        self.f.close()
a = A()
a.f = open()   # 打开文件 第一 在操作系统中打开了一个文件 拿到了文件操作符存在了内存中
del a          # a.f 拿到了文件操作符消失在了内存中
del a   # del 既执行了这个方法,又删除了变量
# __call__
class A:
    def __init__(self,name):
        self.name = name
    def __call__(self):
        ‘‘‘
        打印这个对象中的所有属性
        :return:
        ‘‘‘
        for k in self.__dict__:
            print(k,self.__dict__[k])
a = A(‘alex‘)()

原文地址:https://www.cnblogs.com/kakawith/p/8329500.html

时间: 2024-10-09 21:02:17

python:面向对象进阶的相关文章

Python面向对象进阶和socket网络编程-day08

写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self,name): self.name=name p = Chinese('standby') # 实例化一个对象 print(p) # 打印这个对象 --- <__main__.Chinese object at 0x0000000000B3A978> - 示例2: >&g

python面向对象进阶版

面向对象基础知识: 1.面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 2.类是一个模板,模板中包装了多个'函数'供使用(可以将多函数中公用的变量封装到对象中): 3.对象,根据模板创建的实例(即:对象),实例用于被包装在类中的函数: 4.面向对象三大特性:封装.继承和多态. 面向对象进阶篇详细介绍python类的成员.成员修饰符和类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存

python面向对象进阶

isinstance(obj,cls)检查是否obj是否是类 cls 的对象. isinstance(obj,cls)检查是否obj是否是类 cls 的对象. 反射 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数(参数是对象,字符串格式的属性名) hasattr getattr setattr delattr __del__,就是析构方法,当对象在内存中被释放时,自动触发执行. 注:此方法一般无须定义,

python 面向对象 进阶篇

在上篇<python面向对象>中,简单介绍了python中面向对象的基本知识 在这篇博客中,详细介绍python类的成员,成员修饰符,类的特殊成员. 类的成员 类的成员分为三种:字段,方法和属性 所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 字段 字段包括普通字段和静态字段.静态字段,保存在类中.普通字段,保存在对象中. class FOO: country = “中国

python面向对象进阶(八)

上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象

Python 面向对象进阶

1 isinstance 和issubclass instance:判断该对象是否是类的对象 isinstance(obj,Foo) x = [] print(isinstance(x,list)) 结果:True issubclass:判断是否是继承 class Foo: pass class Bar(Foo): pass print(issubclass(Bar,Foo)) 结果:True 通过下面的方式也可以查看print(Bar.base) 2 反射 反射是Smi首次提出的,主要指程序可

Python面向对象进阶及类成员

再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A:    def bar(self):        print("BAR")        self.f1() class B(A):    def f1(self):        print("B") class C:    def f1(self):        print("C") class D(C,

Python面向对象进阶之高级编程

__slots__:定义类时,使用__slots__变量可以限制能添加的实例的属性 形如:__slots__ = ['name','age'] 这样实例化的对象只能绑定到name和age属性,其他属性则无法被绑定 class People:     __slots__ = ['name','age']     def __init__(self,name,age):         self.name = name         self.age = age p = People('laowa

Python之路-python(面向对象进阶)

一.面向对象高级语法部分 1.静态方法.类方法.属性方法 2.类的特殊方法 3.反射 二.异常处理 三.Socket开发基础 一.面向对象高级语法部分 静态方法(@staticmethod) 定义:只是名义上归类管理,实际上在在静态方法里面访问不了类或实例中的属性 1 class Dog(object): 2 def __init__(self,name): 3 self.name = name 4 5 @staticmethod 6 def eat(x,s): 7 print("%s is e

Python 面向对象进阶(一)

1. 生成器 通过列表生成式,可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个 包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数 的元素占用的空间都白白浪费了.所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的 过程中不断推算出后续的元素呢?这样,就不必创建完整的list,从而节省大量的空间. 在Python中,这种一边循环一边计算的机制,称为生成器(generator) # 创建生成器的方法一:只要